未捕获的 RangeError:Temporal.Instant 不支持持续时间字段天(在不使用幻数的情况下向临时瞬间添加 1 天)

2024-03-02

背景关于Temporal https://tc39.es/proposal-temporal/docs/

我正在尝试添加 1 天Temporal.Instant,用作expJWT 的值。最明显的方法是:

Temporal.Now.instant().add({ days: 1 }).epochSeconds

Throws Uncaught RangeError: Duration field days not supported by Temporal.Instant. Try Temporal.ZonedDateTime instead.这大概是因为Temporal.Instant不包含任何日历信息,并且“1 天”的概念可能会因 DST 和闰秒等因素而有所不同。

显而易见的替代方案是使用 24 小时:

Temporal.Now.instant().add({ hours: 24 }).epochSeconds

还不错,但不是 100% 令人满意,因为现在我们只剩下 24 这个神奇的数字了。

为了解决这个问题,我们可以使用:

Temporal.Now.instant().add({ hours: Temporal.Duration.from({ days: 1 }).total({ unit: 'hours' }) }).epochSeconds

但这非常冗长并且难以直观地解析,因为我们真正想要的是“从现在开始的某一天,从纪元开始的几秒钟内”的概念。

我们还可以使用错误消息建议的选项并使用ZonedDateTime,但时区信息与用例无关,而且无论 DST 等如何,结果最好是未来的一致时间量。

有没有更简洁/惯用的方法来做到这一点而不使用任何幻数?或者我只需要忍住并使用hours: 24?


最后,您必须选择一个策略来确定过期时间戳,而您似乎想要的策略是“24 小时后过期”——这实际上与“1 天后过期,除非持续时间较短或超过24小时”。 “1 天”就像“24 小时”一样具有魔力。 ????

为了使代码更具可读性并且仅将过期策略放在一个位置,您可以将 Temporal.Duration 存储在常量中:

const TOKEN_VALIDITY_DURATION = Temporal.Duration.from({ hours: 24 });
Temporal.Now.instant().add(TOKEN_VALIDITY_DURATION).epochSeconds;

If you really不希望代码中出现数字 24,这是忽略 DST 的转换的稍短版本,您可以在其中使用round()代替total()避免构造第三个持续时间:

Temporal.Duration.from({ days: 1 }).round({ largestUnit: 'hours' })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未捕获的 RangeError:Temporal.Instant 不支持持续时间字段天(在不使用幻数的情况下向临时瞬间添加 1 天) 的相关文章

随机推荐