自 Unix 纪元以来的 *天* 数是多少?

如何解决自 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 天。

所以我的问题是:

  1. 这个整数是否已经有一个众所周知的名字?它是否已经广泛用于表示日期的软件中?我在网上找不到任何有关此概念的参考资料。
  2. 我的逻辑是否正确 - 每个日期是否真的有一个唯一的整数,并且您可以在代码中轻松地将其计算为 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 时间(及其测量单位)的一些细微差别:

  1. 自 UNIX 时代以来,它似乎(相对)被正式定义为 the number of seconds
  2. UNIX 时间机制(不考虑度量单位约定)的主要目的是定义一个时间点。
  3. 在第 2 点的上下文中,实际上,UNIX 时间戳经常返回 in milliseconds 已经成为传统。
  4. 有几个因素会影响您可用的度量单位:
  • API、库和编程语言的设计决策
  • 您正在运行的软件和硬件的时间分辨率/时钟频率 - 例如某些电路、控制器或其他实体无法达到毫秒级分辨率,或者它们的内存中没有足够的可用位来表示大数字。
  • 性能原因 - 通过 HTTP 以毫秒或秒分辨率提供时间服务可能对网络/服务器 CPU 来说太过分了。下一个最好的事情是 UNIX 时间戳 in minutes。然后,中间缓存可以将该值缓存 1 分钟。
  • 用例 - 有些时代(例如在天文学中)以天为主要测量单位。

以下是此类基于日的 epoch 的一些示例:

如果您查看 calculating the Julian Date 的一种方法,除以 86400 是重要的一步。所以,考虑到 JD 系统似乎在天文学中被广泛使用,我认为将这个除以 86400 视为有效是安全的:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-