如果我有一个日期,并且我想检查时间是否为夏令时,我可以使用一种方法,例如:
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具有offsetNanoseconds
read-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
网络开发简化