java 取得unix timestamp_取得系統安裝日期與Unix時間戳(Unix timestamp)

我們在安裝Windows系統時,系統已經給我們將第一次初始裝機的日期寫入到機碼中,以便於我們以後備查,最通常的做法是開始-執行-輸入cmd確定,開啟命令提示符,輸入systeminfo這個命令,然後就會取得初始安裝日期。那麼這個日期究竟儲存在機碼什麼地方呢?

使用regedit開啟機碼編輯器,定位到HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion分支,在右邊鍵值中找到InstallDate,對的這個就是我們要找的安裝日期。

3629084765.png

我們雙擊這個日期,這時機碼顯示「編輯 DWORD 值」對話盒,預設基數是16進位的,我們先改成10進位的,什麼?看不懂這個時間?先不急,這個是Unix時間戳,接下來我就要介紹這個。

3574680383.png

什麼是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方法進行了轉換。