你怎么称呼自 UNIX 纪元以来的“天数”?

Dan*_*ard 9 datetime date unix-timestamp

我最初了解到Unix时间是自1970年1月1日00:00:00(UTC)以来经过的秒数。一天有24小时,这意味着unix时间戳每天都会增长86400。

然后我听说了闰秒的概念,并认为这意味着也许在某些日子里,unix 时间戳会在一天内增长 86401 秒,但显然情况并非如此。根据我的阅读,每天都被视为恰好包含 86400 秒。当你得到闰秒时,操作系统会以某种方式“捏造”它,以确保仍然有 86400 个时间戳 - 要么让当天的每个“秒”比真正的 SI 秒长一点,要么他们会报告连续两次相同的整数时间戳。

所以我认为这意味着自 1970 年 1 月 1 日以来的每个日期都可以映射到一个唯一的整数,即当天 00:00:00 (UTC) 的时间戳除以 86400。(保证是一个没有余数的整数,因为每天讨论的必须有 86400 个时间戳)。或者,您可以采用当天的任何时间戳并计算floor(timestamp / 86400)

例如,今天,2021 年 4 月 23 日星期五 - UTC 时间 00:00:00 的时间戳为 1619136000。正如预期的那样,这是 86400 的倍数,并且 1619136000 / 86400 = 18740。自 Unix 纪元以来已经有 18740 天了。

所以我的问题是:

  1. 这个整数是否已经有一个众所周知的名字了?它是否已在软件中广泛用于表示日期?我在网上找不到任何关于这个概念的参考。
  2. 我的逻辑是否正确 - 每个日期确实有一个唯一的整数,并且您可以在代码中轻松地将其计算为timestamp_at_midnight_utc / 86400?或者是有一些我忽略的微妙问题。

我的动机是,我经常必须进行复杂的计算,涉及大量没有任何时间信息的日期(我在一家度假租赁公司工作,每个单位都有自己的可用性日历)。我认为,如果我使用唯一表示日期的整数而不是DateTime对象或字符串(如'2021-04-23'.

Ole*_*.V. 6

是的,你的逻辑是正确的。我仍然担心的是它要求你在 UTC 中进行计算。度假租赁发生在一个时区,而将该时区的日期与 UTC 一天的开始相关联可能很快就会变得混乱。

\n

是的,有时会使用自 1970 年 1 月 1 日以来的天数概念,尽管我并不经常看到。

\n

在 Java 文档中,使用术语 \xe2\x80\x9cepoch day\xe2\x80\x9d 和 \xe2\x80\x9cepoch day count\xe2\x80\x9d,但这并不会使这些术语成为标准。

\n

我认为您要考虑的第一个途径是您的编程语言是否附带一个用于计算天数而无需在秒之间转换的库,或者是否有一个值得信赖的第三方库可供您用于此目的。

\n

这个 Java 片段证实了您的计算:

\n
    // A LocalDate in Java is a date without time zone or UTC offset\n    LocalDate date = LocalDate.of(2021, Month.APRIL, 23);\n    long epochDayCount = date.toEpochDay();\n    System.out.println("Epoch day: " + epochDayCount);\n
Run Code Online (Sandbox Code Playgroud)\n

输出与您得到的结果一致:

\n
\n

大纪元:18740

\n
\n

链接: Java 文档中的纪元天计数。

\n