如何解决在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"
我认为没有任何方法可以为parsing和formatting设置特定的偏移量,例如“ -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 举报,一经查实,本站将立刻删除。