我有一个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
假定时区的差异
给定日期字符串"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)
发生这种情况是因为使用toString默认情况下以本地时区返回日期和时间的方法打印日期.该方法toUTCString将为您提供所需的字符串.
Date 实际上将日期保持为unix时间(以毫秒为单位),并提供操作它的方法.