對協定來說,取得正確的日期與時間可能非常重要。兩者都可以作為中繼資料使用,例如網路檔案協定中的檔案修改時間戳;也可以用來判斷驗證憑證是否過期。
時間戳實作不正確可能造成嚴重的安全問題——憑證過期判斷一旦失準,等於驗證機制被繞過。
日期與時間的表示方式取決於使用需求、應用程式執行的平台,以及協定的空間需求。以下說明兩種常見表示法。
POSIX/Unix 時間#
目前 POSIX/Unix 時間以 32 位元有號整數儲存,代表自 Unix 紀元(Unix epoch)以來經過的秒數。紀元通常定義為 UTC 1970 年 1 月 1 日 00:00:00。
這不是高解析度的計時器,但對多數情境已經足夠。
作為 32 位元整數,這個值的上限是 UTC 2038 年 1 月 19 日 03:14:07,屆時表示法會溢位。部分現代作業系統已改用 64 位元表示法來解決這個問題。
Windows FILETIME#
Windows FILETIME 是 Microsoft Windows 用於檔案系統時間戳的日期時間格式。由於它是 Windows 上唯一具有簡單二進位表示的格式,也出現在一些協定之中。
| 項目 | POSIX/Unix 時間 | Windows FILETIME |
|---|---|---|
| 型別 | 32 位元有號整數 | 64 位元無號整數 |
| 單位 | 1 秒 | 100 奈秒 |
| 紀元 | UTC 1970-01-01 00:00:00 | UTC 1601-01-01 00:00:00 |
FILETIME 因此擁有比 POSIX/Unix 時間格式更大的範圍。
在傾印資料中辨識時間戳時,紀元與單位就是最好的指紋:看到 32 位元的秒數值先往 Unix 時間猜,看到很大的 64 位元值則值得往 FILETIME 方向試。