2009-06-08 79 views
2

大多数语言都有某种日期函数,在这种日期函数中,您实际上不需要进行任何编程即可获取日期函数/对象中获取的任何日期信息。我很好奇在幕后发生了什么事情?计算机如何计算日期信息?

+0

你能更具体地了解你在这里有什么困惑吗? – Joey 2009-06-08 14:09:21

+2

很多...不要写你自己的:P – workmad3 2009-06-08 14:10:31

回答

8

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

取决于您的语言/环境日期对象既可以自己执行日期计算,也可以使用其他函数来实现此目的。这些确保闰年得到正确处理,并且不会创建无效日期。

但也许我得到你的问题错了。

3

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

5

通常情况下,一台计算机正在存储自过去某个特定时间和日期以来某个时间单位的时间数量。例如,在Unix系统中,这可能是Unix Epoch自1970年1月1日凌晨2点开始的秒数。在Windows中,这是自1601-01-0以来的100ns间隔数(谢谢JohannesRössel)。或者,它可能与计算机启动后的秒数一样简单。

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

诸如NTP (Network Time Protocol)之类的系统可用于通过网络通过NTP服务器将计算机的内部计数与原子钟同步。要做到这一点,他们NTP会考虑往返时间,并了解到NTP服务器链接的错误种类。

+2

不是所有的日期/时间系统都是基于时代的。并不是所有的以时代为基础的以次为基础的。例如,Windows自1601-01-01以来使用100 ns间隔。 – Joey 2009-06-08 14:15:25

1

你的电脑有一个系统时钟,BIOS有一个定时器功能,可以从你的操作系统更新。语言只是从那里获取信息,有些可以更新。

3

那么......大多数计算机都包含一个“real-time clock”,它按秒,分钟等人类尺度计算时间。传统上,主板上有一个小电池,可让芯片记住时间,或即使计算机的其他部分断电,也要继续计数。

今天许多计算机都使用像network time protocol这样的服务来周期性地查询集中的高精度时钟来设置当前时间。这样,即使电池被移除(或者仅仅是失败),计算机仍然会知道它是什么时间和日期,并且能够更新(纠正实时芯片的时间保持中的错误)该信息尽可能经常。

1

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

3

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

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

日期的表示形式也可能不同,通常使用一些(任意)startdate。天文学家也使用的一个通用系统是Julian day numbers(不要与Julian calendar混淆)。日期可以存储为开始后的秒数或开始后的天数(后者通常是浮点数)。这里是some more algorithms

2

的令人惊讶的复杂的代码一个令人惊讶的量所需的日期解析,计算,创建等等

例如,在Java中,日期被计算,修改,经由DateCalendar存储等,并且具体地,并且通常,Gregorian Calendar implementation of Calendar。 (你可以download the SDK/JDK,看你自己的来源。)

简而言之,我从源文件中快速浏览的内容是:日期处理是非平凡的,而不是你想要自己尝试的东西。如果可能的话找一个好的图书馆,否则你几乎可以肯定是reinventing the square wheel

1

大多数回复都是关于如何获得当前日期。即来自系统时钟等等。

如果你想知道如何存储和使用它有很多不同的实现,它取决于系统。

我相信一个常见的是在T-sql中使用64位有符号整数01/01/1970是0所以负数是在1970年之前,并且从每增加100秒增加到正数认为这是第100个需要检查)。

为什么01/01/1970你可能会问这是因为公历是400年的周期。 01/01/1970正在关闭当前日期的周期开始。

这是因为“每年可以被四整除的年份是闰年,除了可以被100整除的年份之外;可以被400整除的百年年份仍然是闰年,例如,年份1900年不是闰年,2000年是闰年。“使其变得非常复杂我认为400年周期与本周重复的日期相吻合,但是将需要检查。基本上它非常复杂。

在内部,编写日期时间库会计所有这些变化(如闰年),事实上不存在第零年......更不用说UTC,GMT UT1时间。

1

我们有机会在调试客户端问题时看看SQL如何存储日期时间......相当有趣并且一旦看到它就会变得非常有意义。

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