如何解决自 Unix 纪元以来的 *天* 数是多少?
我最初了解到 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 天。
所以我的问题是:
- 这个整数是否已经有一个众所周知的名字?它是否已经广泛用于表示日期的软件中?我在网上找不到任何有关此概念的参考资料。
- 我的逻辑是否正确 - 每个日期是否真的有一个唯一的整数,并且您可以在代码中轻松地将其计算为
timestamp_at_midnight_utc / 86400
?或者我忽略了一些微妙的问题。
我在这里的动机是,我经常不得不在没有任何时间信息的情况下进行涉及大量日期的复杂计算(我在一家度假租赁公司工作,每个单位都有自己的可用性日历)。如果我使用唯一表示日期的整数,而不是 DateTime
对象或 '2021-04-23'
之类的字符串,我认为我可以在代码中进行很多效率改进。
解决方法
是的,你的逻辑是正确的。我仍然担心的是,它要求您使用 UTC 进行计算。假期出租发生在一个时区,而将那个时区的日期与 UTC 中的一天开始相关联可能很快就会变得混乱。
是的,有时会使用自 1970-01-01 以来的天数这一概念,尽管我见过的并不常见。
在 Java 文档中使用了术语“纪元日”和“纪元日计数”,但这并不使这些术语成为标准。
我认为您要考虑的第一个途径是您的编程语言是否带有用于计算天数而无需在秒之间进行转换的库,或者是否有可信赖的第三方库可以用于目的。
此 Java 代码段证实了您的计算:
// A LocalDate in Java is a date without time zone or UTC offset
LocalDate date = LocalDate.of(2021,Month.APRIL,23);
long epochDayCount = date.toEpochDay();
System.out.println("Epoch day: " + epochDayCount);
输出与你得到的结果一致:
纪元日:18740
链接: Epoch day count 在 Java 文档中。
,根据我的经验,“自纪元以来的日子”没有正式名称。可以检测到有关 UNIX 时间(及其测量单位)的一些细微差别:
- 自 UNIX 时代以来,它似乎(相对)被正式定义为 the number of seconds。
- UNIX 时间机制(不考虑度量单位约定)的主要目的是定义一个时间点。
- 在第 2 点的上下文中,实际上,UNIX 时间戳经常返回 in milliseconds 已经成为传统。
- 有几个因素会影响您可用的度量单位:
- API、库和编程语言的设计决策
- 您正在运行的软件和硬件的时间分辨率/时钟频率 - 例如某些电路、控制器或其他实体无法达到毫秒级分辨率,或者它们的内存中没有足够的可用位来表示大数字。
- 性能原因 - 通过 HTTP 以毫秒或秒分辨率提供时间服务可能对网络/服务器 CPU 来说太过分了。下一个最好的事情是 UNIX 时间戳 in minutes。然后,中间缓存可以将该值缓存 1 分钟。
- 用例 - 有些时代(例如在天文学中)以天为主要测量单位。
以下是此类基于日的 epoch 的一些示例:
- Julian Day 系统 - 它有一个非整数 Julian Date (JD) 而是一个整数 Julian Day Number (JDN)。它的纪元是公元前 4714 年 11 月 24 日中午。
- J2000 epoch - 也通过 Julian Date 测量。它的纪元是 UTC 时间 2000 年 1 月 1 日 11:58:55.816。
如果您查看 calculating the Julian Date 的一种方法,除以 86400 是重要的一步。所以,考虑到 JD 系统似乎在天文学中被广泛使用,我认为将这个除以 86400 视为有效是安全的:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。