1. 程式人生 > >Windows的本地時間(LocalTime)、系統時間(SystemTime)、格林威治時間(UTC-Time)、檔案時間(FileTime)之間的轉換

Windows的本地時間(LocalTime)、系統時間(SystemTime)、格林威治時間(UTC-Time)、檔案時間(FileTime)之間的轉換

  首先,先從簡單的說起,本地時間(LocalTime),也就是系統設定時區的當前時間!比如說當前系統設定的時區為“(UTC+08:00)北京,重慶,香港特別行政區,烏魯木齊”(東八區),系統的右下角通知區域顯示的時間為“2012/5/18 16:57”,那麼這個時間就是當前系統的本地時間!

  要說清楚什麼是系統時間(SystemTime)之前先來了解一下格林威治時間。本初子午線被定義為通過格林威治經線的位置,相對這條經線的時區向東遞增,向西遞減,每隔一個時區,相差一個小時。那麼,上面例子中的東八區的時間就是相對於格林威治時間加上了八個小時!而Windows的系統時間是就是格林威治時間!知道了這一點,本地時間與系統時間之間的轉換也就很容易了。將上面的本地時間“2012/5/18 16:57”轉換到系統時間只要減去八個小時就行了!轉換結果為“2012/5/18 8:57”。

  本地時間與系統時間的都是用SYSTEMTIME結構來儲存的,關於這個結構參見MSDN。

  檔案時間(FileTime)的儲存方式則與本地時間、系統時間有些不同,它使用64位的資料長度儲存。引用MSDN上面的一句原話“A file time is a 64-bit value that represents the number of 100-nanosecond intervals that have elapsed since 12:00 A.M. January 1, 1601 Coordinated Universal Time (UTC).”這個64位的值記錄了自1601年1月1日0點以來的以100納秒(ns)為單位的格林威治時間間隔

,注意,是納秒,不是毫秒!將這個資料轉換為秒的話要除以10^7(1秒 = 10^9納秒,這裡是100納秒單位)!瞭解了上面的格林威治時間,理解這個很容易!

  本地時間與系統時間之間的轉換上面已經說了,這其中的轉換因子就是當前系統的時區,也可以通過SystemTimeToTzSpecificLocalTime、TzSpecificLocalTimeToSystemTime兩個函式來完成,這兩個函式在轉換時都要指定時區資訊,具體用法參考MSDN。下面談談系統時間與檔案時間、本地時間與檔案時間之間的轉換。因為用到檔案時間的地方不僅僅限於記錄檔案的建立、修改時間。而且還可以通過檔案時間的轉換函式來完成系統時間與本地時間的轉換!

  1. 系統時間與檔案時間的轉換SystemTimeToFileTime、FileTimeToSystemTime
  2. 本地時間與檔案時間的轉換LocalFileTimeToFileTime、FileTimeToLocalFileTime惠山人才網北侖人才網峨眉人才網

  從上面可以看出,本地時間與系統時間的轉換也可以通過檔案時間來完成。這裡需要注意一點的是,本地時間和檔案時間都是對於當前系統的時區而言的,這樣會出現同一個檔案放到不同時區的系統中時,檔案的建立時間,修改時間等等都會不一樣。因為檔案建立時間,修改時間等都是以檔案時間方式記錄的,作業系統在將檔案時間轉換為本地時間時要根據系統當前的時區作為參考。所以,在系統時間與本地時間之間轉換時最好的方式是採用檔案時間函式,這樣時區的問題會由作業系統解決。此外,還有一些函式使用的資料結構中也用到了檔案時間,比如用於檢索系統定時資訊的GetSystemTimes的引數、查詢系統時間資訊時用到的NtQuerySystemInformation中的SYSTEM_TIME_INFORMATION結構,都是給出的檔案時間!知道了這一點,將它們轉換為本地時間就很容易了。

--克勞德曼

2012-5-18 21:09:36