解析ISO 8601日期字符串时如何假设本地时区?

Cra*_*ooB 25 javascript

我有一个ISO日期字符串如下

 var startTimeISOString = "2013-03-10T02:00:00Z";
Run Code Online (Sandbox Code Playgroud)

当我使用下面的代码将它转换为javascript中的日期对象时,它返回

var startTimeDate = new Date(startTimeISOString);
Run Code Online (Sandbox Code Playgroud)

输出是

Date {Sun Mar 10 2013 07:30:00 GMT+0530 (India Standard Time)}
Run Code Online (Sandbox Code Playgroud)

它肯定会将ISOString转换为日期,但它会转换为本地时间,因为new Date()它取决于客户端.如何将iso日期时间字符串转换为日期和时间而不是本地日期时间..?

谢谢

Cra*_*ooB 52

据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 ) );
Run Code Online (Sandbox Code Playgroud)

这将在iso日期字符串中给出相同的日期时间,这里的输出是

O/P

Date {Sun Mar 10 2013 02:00:00 GMT+0530 (India Standard Time)}
Run Code Online (Sandbox Code Playgroud)


Rob*_*obG 12

总结来自tracevipin帖子的对话:

所有Date对象都基于自1970-01-01T00:00:00Z以来的毫秒时间值,因此它们的核心是UTC.这与UNIX不同,UNIX使用的值代表自同一纪元以来的秒数.

Date.prototype.toString方法返回表示基于客户端(又名当地时间)偏移的系统设置和时区的时间依赖于实现的字符串.

如果需要UTC ISO8601时间字符串,则可以使用Date.prototype.toISOString方法.如果需要,可以很容易地为这些方法编写"垫片".

最后,不要相信Date.parse来解析字符串.在ES5中指定了对ISO8601格式UTC字符串的支持,但是在使用的浏览器中并不是一致的.如果需要广泛的浏览器支持(例如典型的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));
}
Run Code Online (Sandbox Code Playgroud)

这是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';
    } 
  }());
}
Run Code Online (Sandbox Code Playgroud)


Dio*_*ode 5

发生这种情况是因为使用toString默认情况下以本地时区返回日期和时间的方法打印日期.该方法toUTCString将为您提供所需的字符串.

Date 实际上将日期保持为unix时间(以毫秒为单位),并提供操作它的方法.