当我注意到setUTCHours()返回错误的一天时,我一直在玩Date()对象。
示例:
var myDate = new Date(2014, 0, 1);
myDate.setUTCHours(10);
myDate;
看着这个,我预计这个日期是2014年1月1日星期三10:00:00 UTC,但相反它落后了一天。那是为什么?
这是我的http://jsfiddle.net/L5QEC/与其他一些基本方法的比较。
答案 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。