我注意到toTimeString
方法有以下奇怪的行为。
const date1 = new Date("2022-09-23T00:00:00.00Z")
const date2 = new Date()
date1.toTimeString()
//17:00:00 GMT-0700 (Pacific Daylight Saving Time)
date2.toTimeString()
// 15:06:43 GMT-0800 (Pacific Standard Time)
我还注意到date1
的结果甚至取决于设备区域设置(至少对于Mac)
date1.toTimeString()
// if region is set to Canada
// 17:00:00 GMT-0700 (Pacific Daylight Saving Time)
// if region is set to United States
// 17:00:00 GMT-0700 (Pacific Daylight Time)
另一个观察结果
date2.toTimeString()
// this is the result for both United States and Canada
// 15:06:43 GMT-0800 (Pacific Standard Time)
几个问题
1.为什么结果取决于日期的构造方式?(new Date("2022-09-23T00:00:00.00Z")
与new Date
)
1.对于new Date("2022-09-23T00:00:00.00Z")
,为什么结果取决于设备设置?
1.当没有传递参数时,结果看起来是一致的,例如new Date()
。我们是否可以假设这将产生一致的时区名称,而不管设备设置如何?
注意:我也注意到date-fns-tz
有同样的行为
编辑:在上面增加了一个例子。
另一个问题:4.与问题2相反,new Date().toTimeString()
不受地区设置的影响,为什么会这样
编辑2:我想通了。对于有日光储蓄的国家。toTimeString()
的行为将根据时间戳福尔斯来产生不同的时区。
将此线程留在此处,因为它可能对其他人有帮助
2条答案
按热度按时间wh6knrhe1#
1.第一种情况是调用Date构造函数,该构造函数以字符串形式表示日期
2022-09-23
,时间为00:00:00 (GMT offset 0)
,它返回日期为09/23/2022 00:00:00的Date对象示例。第二种情况是调用空Date构造函数,该构造函数返回日期为当前日期和时间的Date对象示例。1.接下来,当您调用
toTimeString()
方法时,它返回以本地时区解释的Date对象的时间部分(请参阅更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toTimeString)。1.如果您想获得当地时区名称,请参阅此处How can I get the timezone name in JavaScript?
ffdz8vbo2#
1.为什么结果取决于日期的构造方式?(新日期(“2022-09- 23 T00:00:00.00Z”)与新日期)
时间戳“2022-09- 23 T00:00:00.00Z”由于尾部“Z”而被解析为零偏移。这实际上使其成为UTC。
调用
new Date()
会为当前日期和时间创建一个 Date 示例。toTimeString 会根据系统设置返回一个 Date 示例所代表的时间。因此,对于一个给定的示例,如果您将系统设置中的位置更改为具有不同偏移量的位置,您将得到不同的时间。如果区域设置适用于遵守夏令时(DST)的地方,则在DST生效和不生效的年份中,您还将获得不同的日期偏移量(和民用时区名称)。
1.对于新日期(“2022-09- 23 T00:00:00.00Z”),为什么结果取决于器械设置?
无论系统设置如何,创建的 Date 示例都是完全相同的,因为时间戳中的偏移量固定为0。toTimeString 的结果取决于系统设置,因为它从系统设置中获取主机偏移量和民用时区名称的信息。
1.当没有传递参数时,结果看起来是一致的,例如new Date()。我们是否可以假设这将产生一致的时区名称,而不管设备设置如何?
不可以。时区名称未标准化,并且根据ECMA-262的实施情况而定。但是,实际偏移量应保持一致。
我建议阅读Why does Date.parse give incorrect results?以了解一些背景知识。