如果我有一个日期,我想检查时间是否是DST,我可以使用一种方法,例如:
function isDST(d) {
let jan = new Date(d.getFullYear(), 0, 1).getTimezoneOffset();
let jul = new Date(d.getFullYear(), 6, 1).getTimezoneOffset();
return Math.max(jan, jul) != d.getTimezoneOffset();
}
(源代码here)
在我使用MomentJS库的情况下,我以这种方式达到相同的效果:moment().isDST();
有人知道如何在即将到来的时间做同样的事情吗?
2条答案
按热度按时间pbgvytdp1#
我建议不要这样做,至少不要以这种形式。
除了在评论中提到的爱尔兰例子,还有其他时区管辖区,由于夏令时以外的其他原因,UTC的偏移发生一次性或非半年一次的变化,根据定义,任何可能的
isDST()
实现在这些情况下都将发生故障。另一个例子是摩洛哥全年遵守夏令时,斋月除外。对世界上大多数人口来说,“DST”根本没有任何意义。为了解决这个问题,我首先要问你,你打算用这些信息做什么?
例如,如果要在时区名称中指定“Daylight”或“Standard”时间,则可以使用
Intl.DateTimeFormat
和{ timeZoneName: 'long' }
选项,这将给予包含此信息的时区名称。如果您需要将它作为Moment的
isDST()
方法的直接替代,以便将现有系统从Moment移植到Temporal,我建议您重新实现Moment函数,并计划在将来放弃“是DST”的概念。(注意,Moment文档也将此函数描述为一种黑客攻击,有时并不提供正确的信息。)Moment函数的主体可在此处找到,Temporal的等效函数为:
您可能需要此信息的另一个目的是与数据模型中包含“is DST”位的其他系统进行交互(这是一个不正确的概念,但您可能别无选择。)在这种情况下,我建议将“isDST”函数限制为已知使用“DST”概念的允许时区的列表,在其他情况下返回false,这至少应该过滤掉一些假阳性。
58wvjzkj2#
临时API具有
offsetNanoseconds
read-only
属性,还有一个
with
方法,它返回一个新对象,其中指定的字段被覆盖。我不得不承认我还没有测试过它,但是像这样的东西应该基本上相当于你的函数。(月份索引从1开始)
分区日期时间
refine dev
web dev simplified