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



如果我有一个日期,并且我想检查时间是否为夏令时,我可以使用一种方法,例如:

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();    
}

(来源于此(

如果我使用MomentJS库,我会以这种方式达到相同的目的:

moment().isDST();

有人知道如何在即将推出的Temporal中做到这一点吗?

我建议不要这样做,至少不要以这种形式。

除了评论中提到的爱尔兰例子外,在其他时区管辖区,由于夏令时以外的其他原因,UTC的偏移量发生了一次性或非半年一次的变化,根据定义,任何可能的isDST()实施都会在这些情况下出现故障。另一个例子是,摩洛哥全年实行夏令时,斋月除外。对于世界上大多数人口来说;DST";没有任何意义。

为了解决这个问题,我首先要问你将使用这些信息做什么?

例如,如果是,则指定";夏令时";或";标准";时区名称中的时间,您可以将Intl.DateTimeFormat{ timeZoneName: 'long' }选项一起使用,这将为您提供包含此信息的时区名称。

如果您需要它作为Moment的isDST()方法的替代品,以便将现有系统从Moment移植到Temporal,我建议您准确地重新实现Moment函数,并计划放弃";是DST";未来(注意,Moment文档也将此功能描述为有时无法提供正确信息的黑客攻击。(

矩函数的主体可以在这里找到,时态的等价物是:

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

您可能需要此信息的另一件事是与包括";是DST";位(这是一个不正确的概念,但你可能别无选择。(在这种情况下,我建议限制";是DST";函数到一个允许的时区列表,该列表已知采用"时区"的概念;DST";在其他情况下返回false,这至少应该过滤掉一些误报。

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

时态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 ;    
}

分区日期时间

完善dev

网络开发简化

相关内容

  • 没有找到相关文章

最新更新