如何在Javascript中使用Temporal检查夏令时?

tquggr8v  于 2022-12-10  发布在  Java
关注(0)|答案(2)|浏览(192)

如果我有一个日期,我想检查时间是否是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();
有人知道如何在即将到来的时间做同样的事情吗?

pbgvytdp

pbgvytdp1#

我建议不要这样做,至少不要以这种形式。
除了在评论中提到的爱尔兰例子,还有其他时区管辖区,由于夏令时以外的其他原因,UTC的偏移发生一次性或非半年一次的变化,根据定义,任何可能的isDST()实现在这些情况下都将发生故障。另一个例子是摩洛哥全年遵守夏令时,斋月除外。对世界上大多数人口来说,“DST”根本没有任何意义。
为了解决这个问题,我首先要问你,你打算用这些信息做什么?
例如,如果要在时区名称中指定“Daylight”或“Standard”时间,则可以使用Intl.DateTimeFormat{ timeZoneName: 'long' }选项,这将给予包含此信息的时区名称。
如果您需要将它作为Moment的isDST()方法的直接替代,以便将现有系统从Moment移植到Temporal,我建议您重新实现Moment函数,并计划在将来放弃“是DST”的概念。(注意,Moment文档也将此函数描述为一种黑客攻击,有时并不提供正确的信息。)
Moment函数的主体可在此处找到,Temporal的等效函数为:

function isDST(zdt) {
    return (
        zdt.offsetNanoseconds > zdt.with({ month: 1 }).offsetNanoseconds ||
        zdt.offsetNanoseconds > zst.with({ month: 6 }).offsetNanoseconds
    );
}

您可能需要此信息的另一个目的是与数据模型中包含“is DST”位的其他系统进行交互(这是一个不正确的概念,但您可能别无选择。)在这种情况下,我建议将“isDST”函数限制为已知使用“DST”概念的允许时区的列表,在其他情况下返回false,这至少应该过滤掉一些假阳性。

if (!listOfTimeZoneIDsWithDST.includes(zdt.timeZone.id))
  return false;
58wvjzkj

58wvjzkj2#

临时API具有offsetNanosecondsread-only属性,

zdt = Temporal.ZonedDateTime.from('2020-11-01T01:30-07:00[America/Los_Angeles]');
zdt.offsetNanoseconds;
  // => -25200000000000

还有一个with方法,它返回一个新对象,其中指定的字段被覆盖。
我不得不承认我还没有测试过它,但是像这样的东西应该基本上相当于你的函数。(月份索引从1开始)

function isDST(d) {
  let jan = d.with({month: 1}).offsetNanoseconds ;
  let jul = d.with({month: 7}).offsetNanoseconds ;

  return Math.min(jan, jul) != d.offsetNanoseconds ;    
}

分区日期时间
refine dev
web dev simplified

相关问题