setUTCminutes与setMinutes之间的区别

时间:2016-03-01 00:50:03

标签: javascript date timezone utc

JavaScript日期方法之间有什么区别:

setUTCminutes()

setMinutes()

使用setMinutes()会将时区还原为UTC以外的其他内容吗?

我正在考虑是否用日期字符串设置UTC时间:

var dUTC = new Date('March 20, 2016 20:45:00 UTC');

或设置日期,然后使用UTC方法设置小时等:

var d = new Date(2016,3,20);
d.setUTCHours(20);
d.setUTCminutes(45);

但是,我担心第二种方法在某些情况下可能不准确。我不想以错误的UTC日期结束。我的附加组件可以在全世界使用。

3 个答案:

答案 0 :(得分:4)

  

JavaScript日期方法之间有什么区别:

     

setUTCminutes()与

     

setMinutes()

是。设置 UTCMinutes 将根据新的UTC分钟值调整内部时间值(即UTC)。

setMinutes 执行相同的操作但会允许内部时区,因此时间的变化可能会有所不同(因为许多时区不是完整的小时)。

e.g。对于UTC + 0030的时区,如果当地时间是01:00,则将UTC分钟设置为30不执行任何操作(因为它当前是UTC 00:30),但将本地分钟设置为30将设置UTC分钟到00:00

此外,如果新分钟导致日期跨越夏令时边界,则新时间减去UTC和本地的旧时间可能会有所不同。

  

使用setMinutes()会将时区还原为UTC以外的其他内容吗?

没有。日期对象没有时区,主机系统可以。日期对象使用UTC时间值,然后使用主机的时区用于计算,它不是Date本身的属性(因此方法 getTimezoneOffset )。

  

我正在考虑是否用日期字符串设置UTC时间:

     

var dUTC =新日期(' 2016年3月20日20:45:00 UTC');

NO!不要那样做。强烈重新解析使用Date构造函数解析字符串(只搜索此处有关解析的问题数)。该日期格式不是ECMA-262支持的日期格式,因此解析完全取决于实现。时区可能会重新计算,或者您可能会收到无效日期。

  

或设置日期,然后使用UTC方法设置小时等:

var d = new Date(2016,20,3); 
d.setUTCHours(20);
d.setUTCminutes(45);
     

但是,我担心第二种方法可能不准确   某些情况。

传递给Date构造函数的值似乎不正确,值为年,月,日。也许你的意思是:

new Date(2016, 3, 20)  // 20 April, 2016

在上面创建日期时,主机时区将影响用于创建UTC时间值的值。使用UTC方法然后设置时间可能会导致意外结果,所以不要这样做。

如果你想要一些适用于所有地方的东西,请始终使用UTC,然后只转换为" local"输出。因此,如果您想根据UTC创建日期和时间:

var d = new Date(Date.UTC(2016, 3, 20, 20, 45);

将创建2016-04-20T20:45:00Z的日期

答案 1 :(得分:3)

Date实例始终是UTC时间戳。非UTC API(如.toString().getHour().getMinute()等)都基于代码运行环境的时区应用转换。非UTC设置器也做同样的事情。

因此,在任何语言环境中,当您调用new Date()时,您会得到一个适合您当地时区的日期实例,但在内部它是一个UTC时间戳。

如果要从UTC参数显式创建Date实例,可以使用Date.UTC()创建时间戳以传递给Date构造函数:

var utc = new Date(Date.UTC(2016, 1, 29, 19, 11, 45));

这使得一个Date实例与伦敦的计算机构建的Date实例相同(它现在不是BST):

var london = new Date(2016, 1, 29, 19, 11, 45);

因为伦敦时间(不是夏天)与UTC时间相同。

答案 2 :(得分:0)

MDN:

The setMinutes() method sets the minutes for a specified date according to local time.
The setUTCMinutes() method sets the minutes for a specified date according to universal time.

如果当地时区没有每小时偏移量(例如印度GMT + 5:30),则结果会有所不同。

new Date(new Date('March 20, 2016 20:45:00 UTC')).toString()
"Mon Mar 21 2016 02:15:00 GMT+0530 (India Standard Time)"
new Date(new Date('March 20, 2016 20:45:00 UTC')).toUTCString()
"Sun, 20 Mar 2016 20:45:00 GMT"

new Date(new Date('March 20, 2016 20:45:00 UTC').setMinutes(0, 0, 0)).toString()
"Mon Mar 21 2016 02:00:00 GMT+0530 (India Standard Time)"
new Date(new Date('March 20, 2016 20:45:00 UTC').setMinutes(0, 0, 0)).toUTCString()
"Sun, 20 Mar 2016 20:30:00 GMT"

new Date(new Date('March 20, 2016 20:45:00 UTC').setUTCMinutes(0, 0, 0)).toString()
"Mon Mar 21 2016 01:30:00 GMT+0530 (India Standard Time)"
new Date(new Date('March 20, 2016 20:45:00 UTC').setUTCMinutes(0, 0, 0)).toUTCString()
"Sun, 20 Mar 2016 20:00:00 GMT"