如何在解析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时间并提供操作它的方法。

链接地址: http://www.djcxy.com/p/8139.html

上一篇: How to assume local time zone when parsing ISO 8601 date string?

下一篇: Json ISO Date not deserialized as DateTime object