JavaScript setUTCHours返回错误的一天

时间:2014-04-24 23:59:41

标签: javascript date

当我注意到setUTCHours()返回错误的一天时,我一直在玩Date()对象。

示例:

var myDate = new Date(2014, 0, 1);
myDate.setUTCHours(10);
myDate;

看着这个,我预计这个日期是2014年1月1日星期三10:00:00 UTC,但相反它落后了一天。那是为什么?

这是我的http://jsfiddle.net/L5QEC/与其他一些基本方法的比较。

5 个答案:

答案 0 :(得分:3)

日期对象使用UTC的time value。它们还有offset,表示主机系统的时区偏移量。默认情况下,日期和时间将使用偏移量来显示本地值。如果您是UTC + 1,则偏移量为-60,新Date(2014, 0, 1)将为2013-12-31T23:00:00Z创建日期,并使用偏移量显示2014-01-01T00:00:00+0100的本地日期。

因此,如果您将UTC小时数更改为10,则UTC时间为:2013-12-31T10:00:00Z,本地等效时间为2013-12-31T11:00:00+0100

因此,通过将UTC小时数设置为10,您可以有效地将当地时间设置为前一天的11:00(即UTC小时+ 1小时偏移)。

答案 1 :(得分:1)

如果您想以UTC格式设置特定日期和时间,请考虑:

var dt = new Date(Date.UTC(2014, 0, 1, 10, 0, 0));

结果将代表通用时间中的该点,但您会看到它已调整为当地时区以供显示。例如:

"Wed Jan 01 2014 02:00:00 GMT-0800 (Pacific Standard Time)"

答案 2 :(得分:0)

阅读UTC日期,而不是本地(默认)日期:

var myDate = new Date(2014, 0, 1);
myDate.setUTCHours(10);
myDate.toUTCString();

答案 3 :(得分:0)

一种肮脏的方法是在使用 setUTCHours 之前将本地日期转换为UTC

function UTCDate() {
    var dateObject = new Date();
    var UTC = new Date(dateObject.getUTCFullYear(),
              dateObject.getUTCMonth(), dateObject.getUTCDate(),
              dateObject.getUTCHours(), dateObject.getUTCMinutes(),
              dateObject.getUTCSeconds(),dateObject.getUTCMilliseconds());
   return UTC;
}

答案 4 :(得分:0)

当时间为0小时0分钟时,根据格林尼治标准时间会有令人讨厌的一天延迟。

例如,如果格林尼治标准时间为+2,则日期的小时数必须大于2,否则日期要少一天。

我发现避免这种怪异效果的解决方案是使用此技巧。

var myDate = new Date(2014, 0, 1);
var timezoneOffset = myDate.getTimezoneOffset();
if (timezoneOffset > 0) {
  myDate.setMinutes((24 * 60) - (timezoneOffset + 1));
} else {
  myDate.setMinutes(-timezoneOffset); // Do not forget the negative sign !
}
myDate.setUTCHours(10);

因此,当我添加与格林尼治标准时间偏移相对应的时间时,我将不再有这个错误的日期!

我通过更改操作系统的设置(-13,-2,+ 2,+ 12)测试了所有GMT

如果需要,您可以在此之后设置UTCMinutes!

getTimezoneOffset()方法以分钟为单位返回UTC时间与本地时间之间的时差。 例如,如果您的时区为GMT + 2,则将返回-120。

相关问题