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日期结束。我的附加组件可以在全世界使用。
答案 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"