为什么“Temporal.Duration”实例的算术需要“relativeTo”参考日历日期?

Tim*_*ijk 2 javascript datetime calendar duration ecmascript-temporal

提议的 JavaScript Temporal 日期/时间 API 不经意地提到 \xe2\x80\x9c 解释年、月或周需要参考点 \xe2\x80\x9d (来源),但我无法理解这是什么意思。

\n

更具体地说,以下情况是不可能的:

\n
let oneWeek = Temporal.Duration.from({ weeks: 1 });\nconsole.log(`one week is ${oneWeek.total(\'day\')} days`);\n
Run Code Online (Sandbox Code Playgroud)\n

它将导致以下错误:

\n
RangeError: a starting point is required for balancing calendar units\n
Run Code Online (Sandbox Code Playgroud)\n

这可以通过使用relativeTo调用参数来膨胀我的代码来解决total(),如下所示:

\n
RangeError: a starting point is required for balancing calendar units\n
Run Code Online (Sandbox Code Playgroud)\n

但有人能详细说明为什么这是必要的吗?据我所知,一周一直是并且永远是 7 天\xe2\x80\xa6?

\n

Seb*_*mon 5

\n

据我所知,一周一直是并且永远是 7 天

\n
\n

即使在夏令时变化前后?\n您知道,那些将时钟向后或向前更改一小时的星期日吗?\n如果您测量从周三到下周三的持续时间,那么这个 \xe2\x80\x9cone week\xe2\x80\x9d 可能正好是 7 天长,或 6 天 23 小时,或 7 天 1 小时。

\n

请参阅有关相对于参考点平衡的文档:

\n
\n

包括日、周、月和年的平衡更为复杂,因为这些单位的长度可能不同。\n在默认 ISO 日历中,一年可以是 365 或 366 天,一个月可以是 28、29、30 或31 天。\n在其他日历中,年份\xe2\x80\x99t 始终为 12 个月,周\xe2\x80\x99t 始终为 7 天。\n最后,在使用夏令时 (DST) 的时区中,天数并不总是总是24小时。

\n
\n

这也是指闰年

\n

Issue #857 中也有\xe2\x80\x99s的讨论:

\n
\n

具体来说,以下时间尺度单位转换是上下文相关的(\xe2\x80\x9c转换边界\xe2\x80\x9d):

\n
    \n
  • 年 \xe2\x86\x94 天(365、366 天)
  • \n
  • 月 \xe2\x86\x94 天(28、29、30、31 天)
  • \n
  • 分钟 \xe2\x86\x94 秒(59、60、61 秒)
  • \n
\n
\n

最后一个指的是闰秒

\n

当然,时态 API 必须考虑1752 年 9 月发生的情况。\n相关:获取特定月份中某个日期范围内的天数

\n

关键是,某个时间单位有多长这个问题的答案会根据上下文而变化。\n这不仅仅是时区;\n这不仅仅是时区;不同的历法有各种各样的异常现象。

\n

当然,浏览器中使用的公历可能不会受到 1752 年的影响,但这需要了解要使用哪个日历。\n您可以使用 ; 提供此信息relativeTo。它\xe2\x80\x99s 包含在 中Temporal.Now.plainDateISO()。\n现在\xe2\x80\x99s 明确可以使用 ISO 周,该周始终有 7 天。\n但是如果没有此信息,\xe2\x80\x99s 就无法分辨准确地说,通用日期和时间 API 无法确定ISO 周是否是您真正的意思。

\n