计算机如何计算出日期信息?

时间:2009-06-08 14:06:40

标签: datetime

大多数语言都有某种日期功能,您无需进行任何编程即可从日期函数/对象中获取任何日期信息。我很好奇幕后发生了什么事情才能实现这个目标?

11 个答案:

答案 0 :(得分:8)

每台计算机都有一个系统时钟,可以跟踪日期和时间。在从那里检索的最低级别,日期和时间信息。在上面添加了来自操作系统的时区信息等,你得到了一个Date对象或类似的东西。

根据您的语言/环境,日期对象可以自行执行日期计算,也可以使用其他功能来实现。这些确保正确处理闰年并且不能创建无效日期。

但也许我的问题出错了。

答案 1 :(得分:5)

通常,计算机存储自特定时间和日期以来特定时间单位已经过多少的计数。例如,在Unix系统中,这可能是自1990年1月1日格林威治标准时间午夜以来Unix时代的秒数。在Windows中,这是自1601-01-0以来100 ns间隔的数量(感谢JohannesRössel)。或者它可能是自计算机启动以来的秒数这么简单。

因此,根据自该时间/日期以来经过的单位数量,操作系统可以计算已经过去的年数,月数,天数等。当然,必须考虑各种有趣的东西,如闰年和闰秒。

NTP (Network Time Protocol)等系统可用于通过网络通过NTP服务器将计算机的内部计数与原子钟同步。为此,NTP考虑了往返时间,并了解了与NTP服务器链接的错误类型。

答案 2 :(得分:3)

日期和时间信息通常由操作系统提供,因此它是系统调用。操作系统处理安装在计算机主板上的实时时钟,由小电池供电(持续数年)。

答案 3 :(得分:3)

嗯......大多数计算机都包含一个“real-time clock”,它按照人体尺度计算秒,分钟等时间。传统上,主板上有一个小电池,让芯片记住即使计算机的其余部分断电,也要计算时间,甚至计算它。

今天,许多计算机使用network time protocol等服务定期查询集中式高精度时钟,以设置当前时间。这样,即使电池被移除(或者只是失败),计算机仍然会知道它是什么时间和日期,并且能够更新(以纠正实时芯片的时间错误)该信息经常根据需要。

答案 4 :(得分:3)

除了实时时钟,日期计算主要是软件库功能。

日期相当不规则,因此在幕后使用了近似,校正和查找表的混合。

日期的表示也可以变化,通常使用一些(任意的)startdate。天文学家也使用的一个共同系统是Julian day numbers(不要与Julian calendar混淆)。日期可以存储为启动后的秒数或自启动后的天数(后者通常是浮点数)。以下是some more algorithms

答案 5 :(得分:2)

日期解析,计算,创建等需要大量令人惊讶的复杂代码。

例如,在Java中,日期是通过DateCalendar计算,修改,存储等,特别是Gregorian Calendar implementation of Calendar。 (你可以download the SDK/JDK并亲自查看来源。)

简而言之,我从源头上快速阅读的内容是:日期处理非常重要,而不是您想要自己尝试的事情。如果可能的话,找一个好的图书馆,否则你几乎肯定是reinventing the square wheel

答案 6 :(得分:1)

您的计算机有一个系统时钟,BIOS有一个可以从您的操作系统更新的计时器功能。语言只从那里获取信息,有些人也可以更新它。

答案 7 :(得分:1)

Calendrical Calculations上购买任何这些书籍。他们将为您介绍日期库如何在幕后工作。

答案 8 :(得分:1)

日期/时间通常以特定日期以来的时间存储。例如自1月1日以来的滴答(100纳秒间隔)。它也可以通过参考UTC来存储。然后,OS,数据库,框架,应用程序等中的基础方法可以将这些方法转换为更有用的表示。在当天,系统会将日期,日期,月份,年份等组成部分存储为数据结构的一部分,但我们从Y2K混乱中吸取了教训,这可能不是最佳方法。

答案 9 :(得分:1)

大多数回复都与如何获得当前日期有关。即从系统时钟等。

如果您想知道它是如何存储和使用的,那么有许多不同的实现,它取决于系统。

我认为一个常见的是在T-sql中使用64位有符号整数,01/01/1970是0,因此负数是1970年前的,并且每个增量增加100秒后为正数(想想这是第100个需要检查的。)

为什么01/01/1970你可能会问这是因为格里高利历是400年的周期。 1970年1月1日是到当前日期的一个周期的关闭开始。

这是因为“每年可被4整除的是闰年,除了可以被100整除的年份;可以被400整除的百年年份仍然是闰年。例如,1900年不是闰年; 2000年是闰年。“使它变得非常复杂我相信400年的周期恰好与一周中的几天重复,但是需要检查。基本上它非常复杂。

在内部编写日期时间库非常难以解释所有这些变化,例如闰年,事实上没有零年.....更不用说UTC,GMT UT1次。

答案 10 :(得分:1)

我们有机会调试客户端问题,看看SQL如何存储日期时间......相当有趣,一旦看到它就会很有意义。

SQL使用2个4字节整数... 前4个字节是自1753年1月1日以来的日期。我认为最大年份应该是9999,这与4个字节中的可用整数数量并不完全相符,但是你去了。 第二个4字节是自午夜以来的毫秒数。