如何在解析ISO 8601日期字符串时假定本地时区?
我有一个ISO日期字符串如下
var startTimeISOString = "2013-03-10T02:00:00Z";
当我使用下面的代码将它转换为JavaScript中的日期对象时,它会返回
var startTimeDate = new Date(startTimeISOString);
输出是
Date {Sun Mar 10 2013 07:30:00 GMT+0530 (India Standard Time)}
它肯定会将ISOString转换为日期,但它会转换为本地时间,因为new Date()
是依赖于客户端的。 如何将ISO日期时间字符串转换为日期和时间,但不是本地日期时间..?
谢谢
根据MDN:
假定时区的差异
给定一个“2014年3月7日”的日期字符串,parse()会假设一个本地时区,但给定ISO格式(例如“2014-03-07”),它将假定UTC时区。 因此使用这些字符串生成的Date对象将表示不同的时刻,除非系统设置为UTC的本地时区。 这意味着两个显示等同的日期字符串可能会导致两个不同的值,具体取决于正在转换的字符串的格式(在ECMAScript ed 6中更改了此行为,因此两者都将视为本地)。
我已经这样做了,现在正在获取ISO日期字符串中的确切时间,而不是本地时间
var startTimeISOString = "2013-03-10T02:00:00Z";
var startTime = new Date(startTimeISOString );
startTime = new Date( startTime.getTime() + ( startTime.getTimezoneOffset() * 60000 ) );
这将在iso日期字符串中给出相同的日期时间,这里的输出是
O / P
Date {Sun Mar 10 2013 02:00:00 GMT+0530 (India Standard Time)}
总结来自tracevipin的帖子的对话:
所有Date对象都基于自1970-01-01T00:00:00Z以来的毫秒时间值,因此它们的核心是UTC。 这与UNIX不同,UNIX使用自相同历元以来代表秒的值。
Date.prototype.toString方法返回一个实现相关字符串,该字符串表示基于客户端的系统设置和时区偏移(又名本地时间)的时间。
如果需要UTC ISO8601时间字符串,则可以使用Date.prototype.toISOString方法。 如果需要,为这种方法编写一个“垫片”是很容易的。
最后,不要相信Date.parse解析字符串。 支持ISO8601格式的UTC字符串是在ES5中指定的,但是它在所使用的浏览器中并不一致。 如果需要广泛的浏览器支持(例如典型的Web应用程序),手动解析字符串要好得多(这并不困难,有如何做的例子)。
简单的ISO8601 UTC时间戳解析器:
function dateObjectFromUTC(s) {
s = s.split(/D/);
return new Date(Date.UTC(+s[0], --s[1], +s[2], +s[3], +s[4], +s[5], 0));
}
这里是toISOString的一个垫片:
if (typeof Date.prototype.toISOString != 'function') {
Date.prototype.toISOString = (function() {
function z(n){return (n<10? '0' : '') + n;}
function p(n){
n = n < 10? z(n) : n;
return n < 100? z(n) : n;
}
return function() {
return this.getUTCFullYear() + '-' +
z(this.getUTCMonth() + 1) + '-' +
z(this.getUTCDate()) + 'T' +
z(this.getUTCHours()) + ':' +
z(this.getUTCMinutes()) + ':' +
z(this.getUTCSeconds()) + '.' +
p(this.getUTCMilliseconds()) + 'Z';
}
}());
}
发生这种情况是因为日期是使用toString
方法打印的,默认情况下,该方法会在本地时区中返回日期和时间。 toUTCString
的方法会给你你需要的字符串。
Date
实际上保持日期为以毫秒为单位的unix时间并提供操作它的方法。
上一篇: How to assume local time zone when parsing ISO 8601 date string?