我們在安裝Windows系統時,系統已經給我們將第一次初始裝機的日期寫入到機碼中,以便於我們以後備查,最通常的做法是開始-執行-輸入cmd確定,開啟命令提示符,輸入systeminfo這個命令,然後就會取得初始安裝日期。那麼這個日期究竟儲存在機碼什麼地方呢?
使用regedit開啟機碼編輯器,定位到HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion分支,在右邊鍵值中找到InstallDate,對的這個就是我們要找的安裝日期。
我們雙擊這個日期,這時機碼顯示「編輯 DWORD 值」對話盒,預設基數是16進位的,我們先改成10進位的,什麼?看不懂這個時間?先不急,這個是Unix時間戳,接下來我就要介紹這個。
什麼是Unix時間戳
摘自百度百科:Unix時間戳(英文為Unix epoch, Unix time, POSIX time 或 Unix timestamp)是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。UNIX時間戳的0按照ISO 8601規範為 :1970-01-01T00:00:00Z。一個小時表示為UNIX時間戳格式為:3600秒;一天表示為UNIX時間戳為86400秒,閏秒不計算。在大多數的UNIX系統中UNIX時間戳儲存為32位,這樣會引發2038年問題或Y2038。
有意思的是,這種計時方式會導致類似於「千年蟲」這樣的問題,所以如果在設計系統,特別是資料庫欄位,如果32位欄位長度最好就不要用Unix時間戳來儲存實際時間,否則2038年,系統時間就會出問題了。
好了,介紹了這些,下面該談談程式設計語言中如何取得及轉換Unix時間戳了,站長之家的站長工具給我們提供了一個線上轉換的頁面,同時也詳細介紹了各個程式設計語言如何取得及如何轉換,大家可以去看看。我這裡摘錄部分程式設計方法以便於備忘。
如何在不同程式設計語言中實現Unix時間戳(Unix timestamp) → 普通時間?JavaString date = new java.text.SimpleDateFormat(「dd/MM/yyyy HH:mm:ss」).format(new java.util.Date(Unix timestamp * 1000))
JavaScript先 var unixTimestamp = new Date(Unix timestamp * 1000) 然後commonTime = unixTimestamp.toLocaleString()
Linuxdate -d @Unix timestamp
MySQLfrom_unixtime(Unix timestamp)
Perl先 my $time = Unix timestamp 然後 my ($sec, $min, $hour, $day, $month, $year) = (localtime($time))[0,1,2,3,4,5,6]
PHPdate(『r』, Unix timestamp)
PostgreSQLSELECT TIMESTAMP WITH TIME ZONE 『epoch』 + Unix timestamp) * INTERVAL 『1 second』;
Python先 import time 然後 time.gmtime(Unix timestamp)
RubyTime.at(Unix timestamp)
SQL ServerDATEADD(s, Unix timestamp, 『1970-01-01 00:00:00』)
VBScript / ASPDateAdd(「s」, Unix timestamp, 「01/01/1970 00:00:00」)
其他作業系統
(如果Perl被安裝在系統中)命令列狀態:perl -e 「print scalar(localtime(Unix timestamp))」
如何在不同程式設計語言中實現普通時間 → Unix時間戳(Unix timestamp)?Javalong epoch = new java.text.SimpleDateFormat(「dd/MM/yyyy HH:mm:ss「).parse(「01/01/1970 01:00:00」);
JavaScriptvar commonTime = new Date(Date.UTC(year, month – 1, day, hour, minute, second))
MySQLSELECT unix_timestamp(time)
時間格式: YYYY-MM-DD HH:MM:SS 或 YYMMDD 或 YYYYMMDD
Perl先 use Time::Local 然後 my $time = timelocal($sec, $min, $hour, $day, $month, $year);
PHPmktime(hour, minute, second, day, month, year)
PostgreSQLSELECT extract(epoch FROM date(『YYYY-MM-DD HH:MM:SS『));
Python先 import time 然後 int(time.mktime(time.strptime(『YYYY-MM-DD HH:MM:SS『, 『%Y-%m-%d %H:%M:%S』)))
RubyTime.local(year, month, day, hour, minute, second)
SQL ServerSELECT DATEDIFF(s, 『1970-01-01 00:00:00』, time)
Unix / Linuxdate +%s -d」Jan 1, 1970 00:00:01″
VBScript / ASPDateDiff(「s」, 「01/01/1970 00:00:00」, time)
有了上面的預備知識,讓我們再回到剛才的問題,如何取得並轉換當前系統的安裝日期?請看下面的WScript/VBScript程式碼:
Option Explicit
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_DWORD = 4
Function VBMain()
Dim strComputer, strKeyPath, lngValue, Registry
strComputer = "."
strKeyPath = "SOFTWAREMicrosoftWindows NTCurrentVersion"
Set Registry = GetObject(_
"winmgmts:{impersonationLevel=impersonate}!\" &_
strComputer & "
ootdefault:StdRegProv")
Registry.GetDWORDValue HKEY_LOCAL_MACHINE,_
strKeyPath,_
"InstallDate",_
lngValue
WScript.Echo "Unix timestamp : " & lngValue
WScript.Echo "Normal DateTime : " &_
DateAdd("s", lngValue, "01/01/1970 00:00:00")
Set Registry = Nothing
End Function
WScript.Quit(VBMain())
Option Explicit Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_DWORD = 4 Function VBMain() Dim strComputer, strKeyPath, lngValue, Registry
strComputer = "."
strKeyPath = "SOFTWAREMicrosoftWindows NTCurrentVersion"
Set Registry = GetObject(_
"winmgmts:{impersonationLevel=impersonate}!\" &_
strComputer & "
ootdefault:StdRegProv")
Registry.GetDWORDValue HKEY_LOCAL_MACHINE,_
strKeyPath,_
"InstallDate",_
lngValue
WScript.Echo "Unix timestamp : " & lngValue
WScript.Echo "Normal DateTime : " &_
DateAdd("s", lngValue, "01/01/1970 00:00:00")
Set Registry = Nothing
End Function WScript.Quit(VBMain())
可以看出這裡使用了DateAdd方法進行了轉換。