我以PHP为例。我假设这个过程也适用于其他语言。我不一定要寻找限于PHP的答案。
我知道PHP从操作系统中获取Epoch数据。但PHP有practically infinite种格式化日期的方法。它是如何做到的?
对于简单的事情:
date('Y-m-d');
// i.e. "2017-11-20"
......显然是一些简单的数学运算(epoch/1000/60/60/24/etc
)。但它如何解释闰秒?当你进入更独特的格式时,例如:
date('l jS \of F Y h:i:s A');
// i.e. "Monday 20th of November 2017 21:30:55 PM"
它用什么算法来计算当天?从Epoch的开始是否除了计数? Meridian怎么样?还是月份名字?还是夏令时?
编程语言如何知道日期时间是什么?
答案 0 :(得分:0)
这个问题的完整答案是......漫长而复杂。有关详细说明,请参阅The UNIX leap second mess。
这涵盖了UNIX时间戳,但无论操作系统如何,问题基本相同,并且与时间戳的含义有关。传统观点认为它是自大纪元以来的毫秒数。但是当你正在使用的编程库得到它时,它实际上是自纪元日期以来的毫秒数,不包括闰秒。
链接的文章介绍了标准如何更改为包含闰秒,并依赖于时区文件进行调整以消除闰秒。但是这些细节与您的程序的运行时库并不相关,因为它从已经过滤掉闰秒的服务中获取其信息。
因此,就运行时库而言,时间戳实际上并不是衡量自Epoch日期以来已经过去的实际毫秒数的度量。相反,它是您必须添加到Epoch日期以获取当前日期和时间的毫秒数。不同之处在于,正如您所指出的,我们假设每天固定的毫秒数,忽略闰秒。