Javascript setUTCminutes与setMinutes之间的差异
JavaScript日期方法之间是否存在任何差异:Javascript setUTCminutes与setMinutes之间的差异,javascript,date,timezone,utc,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.setUTCmin
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);
var d = new Date(2016,20,3);
d.setUTCHours(20);
d.setUTCminutes(45);
但是,我担心第二种方法在某些情况下可能不准确。我不想以错误的UTC日期结束。我的加载项可以在世界各地使用。日期实例在本质上始终是UTC时间戳。非UTC API,如
.toString()
,.getHour()
,.getMinute()
等,都基于代码运行环境的时区应用转换。非UTC设置器也做同样的事情
因此,在任何语言环境中,当您调用new Date()
时,都会得到一个日期实例,它的行为与您的本地时区类似,但在内部它是UTC时间戳
如果要根据UTC参数显式创建日期实例,可以使用Date.UTC()
创建要传递给日期构造函数的时间戳:
var utc = new Date(Date.UTC(2016, 1, 29, 19, 11, 45));
这使得日期实例与伦敦计算机(现在不是BST)构建的日期实例相同,具有:
因为伦敦时间(不是夏天)与UTC时间相同
JavaScript日期方法之间是否存在任何差异:
setUTCminutes()
setUTCminutes()与
setMinutes()
对。Set-UTCMinutes将根据新的UTC分钟值调整内部时间值(即UTC)
setMinutes做同样的事情,但会允许内部时区,因此时间的变化可能会有所不同(因为许多时区不是完整的小时)
e、 g.对于UTC+0030时区,如果本地时间为01:00,则将UTC分钟设置为30不会起任何作用(因为当前为UTC 00:30),但将本地分钟设置为30将将UTC分钟设置为00:00
此外,如果新的分钟数导致日期跨越夏令时边界,则新时间减去UTC和local中的旧时间可能会有所不同
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"
使用setMinutes()是否会将时区恢复为UTC以外的其他时区
不。日期对象没有时区,主机系统有。日期对象使用UTC时间值,然后在计算中使用主机的时区,它不是日期本身的属性(因此使用方法getTimezoneOffset)
我正在考虑是否使用日期字符串设置UTC时间:
var dUTC = new Date('March 20, 2016 20:45:00 UTC');
var dUTC=新日期(“2016年3月20日20:45:00 UTC”)
不!不要那样做。强烈地重新开始使用日期构造函数解析字符串(只需在此处搜索有关解析的问题数量)。ECMA-262不支持该日期格式,因此解析完全依赖于实现。时区可能会被重新确认,或者您可能会得到一个无效的日期
或使用UTC方法设置日期,然后设置小时等:
var d = new Date(2016,3,20);
d.setUTCHours(20);
d.setUTCminutes(45);
var d = new Date(2016,20,3);
d.setUTCHours(20);
d.setUTCminutes(45);
但是,我担心第二种方法在实际应用中可能不准确
有些情况
传递给日期构造函数的值似乎不正确,值为年、月、日。也许你的意思是:
new Date(2016, 3, 20) // 20 April, 2016
在上面创建日期时,主机时区将影响用于创建UTC时间值的值。然后使用UTC方法设置时间很可能会导致意外结果,因此不要对此进行修改
如果您希望在任何地方都能使用,请始终使用UTC,然后仅转换为“本地”作为输出。因此,如果要基于UTC创建日期和时间:
var d = new Date(Date.UTC(2016, 3, 20, 20, 45);
将创建2016-04-20T20:45:00Z的日期
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"
日期实例始终基于UTC时间戳。重要的是在使用特定于语言环境的API时是否应用了任何翻译。请记住,有些时区与UTC的距离甚至不到一小时的倍数。通过UTC设置器设置UTC日期肯定会起作用。如果你想使用字符串,你可能应该使用ISO8601格式。我不知道它是否仍然被称为“BST”;我来自遥远的过去。因为时区的命名没有标准,你可以随意称呼它但它似乎是常用的。上一个示例中的超小错误:var d=新日期(Date.UTC(2016,3,20,20,45);应该是var d=新日期(Date.UTC(2016,3,20,20,45));缺少最后一个括号-谢谢!