2009-06-08 76 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字節是午夜以來的毫秒數。