在JavaScript中将时间表示为CST-date-fns

如何解决在JavaScript中将时间表示为CST-date-fns

我正在使用date-fns格式化日期

如果我传递的日期以Z结尾,则它知道它是UTC,并且我可以format(date,"yyyy-MM-dd"),它将以本地计算机时间显示。

如果我要在本地计算机时间中表示的日期本来是CST,那么是否要在末尾添加一些内容而不是Z,那么格式化功能会将其理解为CST日期?

抱歉,这是一个不好的问题

编辑:是否可以在date-fns中执行zonedTimeToUtc(myDate,'UTC-6')? (而不是使用时区 name

解决方法

尝试使用矩库来解决您的时间问题:moment.js及其补充语moment-timezone.js

要输出转换为CST时区的当前时间:

moment().tz('America/Chicago').format('hh:mm:ss z')

06:43:34 CST

moment().tz('America/Chicago').format('hh:mm:ss z Z')

06:43:35 CST -06:00

moment().tz('America/Chicago').format()

2020-08-13T15:52:09-06:00

或者可以使用如下功能:

const calcTime = (cityOffset) => {
  var now = new Date();
  // convert to msec and add local time zone offset and get UTC time in msec
  var utc = now.getTime() + (now.getTimezoneOffset() * 60000);

  // create new Date object for different city using supplied offset
  var newTime = new Date(utc + (3600000 * cityOffset));

  return newTime.toLocaleString();
}
,

如果您有一个始终希望使用date-fns解析为CST(美国中央标准时间)的字符串,则可以包含date-fns-tz并在解析时设置时区(我假设ISO 8601宽松格式没有时区)。请注意,为避免DST,您必须选择一个全年都是UTC-6的位置,例如加拿大/萨斯喀彻温省。

// Setup
var {parse} = require('date-fns');
var {zonedTimeToUtc,utcToZonedTime,format } = require('date-fns-tz');

// Parse using location for offset
let loc = 'Canada/Saskatchewan';
let s   = '2020-08-14 13:05:52';
let fIn = 'yyyy-MM-dd HH:mm:ss';
let utcDate =  zonedTimeToUtc(s,loc);
// Show local equivalent
console.log(utcDate);

这使您有点受萨斯喀彻温省管理员的摆布,他们可能会更改偏移量或引入DST。一种替代方法是将所需的确切偏移量附加到时间戳上,并将其包括在解析令牌中:

// Parse using string for offset
let tz = '-06';
let utcDate2 =  parse(s + ' ' + tz,fIn + ' X',new Date());
// Show local equivalent,should be same as above
console.log(utcDate2);

第二种方法的优点是它不需要date-fns-tz,并且您不必担心萨斯喀彻温省(或其他任何IANA位置)的偏移量的历史或将来的变化。

显然,正在开发一个UTC模块,该模块将允许设置-6之类的特定偏移量,而不是使用IANA位置(找不到指向该注释atm的链接)。

这时该字符串已解析为GMT-6,但仍只是一个简单的Date(即,只是一个时间值,不知道与原始字符串相关联的时区)。

一旦有了日期,就可以将其显示为CST以便输出。要在调用 format 的偏移中使用IANA位置,您必须使用date-fns-tz格式,而不是纯date-fns格式,否则它将仅使用主机系统偏移。>

请注意,格式调用中的值只是设置要用于偏移量字符串的值,它对实际的日期和时间没有任何作用, utcToZonedTime 已应用调整>。

// Adjust to CST
let dCST = utcToZonedTime(utcDate2,loc);
// Format strings:
let fOut1 = 'yyyy-MM-dd HH:mm:ss XXX'; // -0600
let fOut2 = 'yyyy-MM-dd HH:mm:ss z';   // CST
// Format using location
console.log(format(dCST,fOut1,{timeZone: loc}));
console.log(format(dCST,fOut2,{timeZone: loc}));

我更喜欢-0600版本,因为它避免了是否遵守DST(实际上就是代码在做什么)的问题。另外,在“ z”版本中,您可能会获得偏移量或时区名称(可能取决于主机的默认语言和位置,这是使用 Intl.DateTimeFormat 的date-fns-tz的古怪之处)想)。

您还可以使用以下格式字符串手动添加时区:

let fOut = 'yyyy-MM-dd HH:mm:ss \'-0600\'';

这将产生如下输出:

"2020-08-14 13:05:52 GMT-0600"

我认为没有任何方法可以为parsingformatting设置特定的偏移量,例如“ -0600”,而不会在通话中包含它。我认为moment.js和luxon允许。

为完整起见,这里的一些代码可以在npm.runkit.com上运行,因为当前date-fns版本没有CDN允许代码在此处运行。

var {parse} = require('date-fns');
var {zonedTimeToUtc,loc);
// Show local equivalent
console.log(utcDate);

// Parse using string for offset
let tz = '-06';
let utcDate2 =  parse(s + ' ' + tz,should be same as above
console.log(utcDate2);

// Format using location:
let fOut1 = 'yyyy-MM-dd HH:mm:ss XXX'; // -0600
let fOut2 = 'yyyy-MM-dd HH:mm:ss z';   // CST
let dCST = utcToZonedTime(utcDate2,loc);
console.log(format(dCST,{timeZone: loc}));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-