获取系统安装日期与Unix时间戳(Unix timestamp)
提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!
我们在安装Windows系统时,系统已经给我们将第一次初始装机的日期写入到注册表中,以便于我们以后备查,最通常的做法是开始-运行-输入cmd确定,打开命令提示符,输入 systeminfo 这个命令,然后就会获取初始安装日期。那么这个日期究竟保存在注册表什么地方呢?
使用regedit打开注册表编辑器,定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 分支,在右边键值中找到 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 ) → 普通时间?
Java | String 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() |
Linux | date -d @ Unix timestamp |
MySQL | from_unixtime( Unix timestamp ) |
Perl | 先 my $time = Unix timestamp 然后 my ($sec, $min, $hour, $day, $month, $year) = (localtime($time))[0,1,2,3,4,5,6] |
PHP | date('r', Unix timestamp ) |
PostgreSQL | SELECT TIMESTAMP WITH TIME ZONE 'epoch' + Unix timestamp ) * INTERVAL '1 second'; |
Python | 先 import time 然后 time.gmtime( Unix timestamp ) |
Ruby | Time.at( Unix timestamp ) |
SQL Server | DATEADD(s, Unix timestamp , '1970-01-01 00:00:00') |
VBScript / ASP | DateAdd("s", Unix timestamp , "01/01/1970 00:00:00") |
其他操作系统
(如果Perl被安装在系统中) |
命令行状态: perl -e "print scalar(localtime( Unix timestamp ))" |
Java | long epoch = new java.text.SimpleDateFormat(" dd/MM/yyyy HH:mm:ss ").parse("01/01/1970 01:00:00"); |
JavaScript | var commonTime = new Date(Date.UTC( year , month - 1, day , hour , minute , second )) |
MySQL |
SELECT unix_timestamp(
time
)
时间格式: YYYY-MM-DD HH:MM:SS 或 YYMMDD 或 YYYYMMDD |
Perl | 先 use Time::Local 然后 my $time = timelocal($sec, $min, $hour, $day, $month, $year); |
PHP | mktime( hour , minute , second , day , month , year ) |
PostgreSQL | SELECT 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'))) |
Ruby | Time.local( year , month , day , hour , minute , second ) |
SQL Server | SELECT DATEDIFF(s, '1970-01-01 00:00:00', time ) |
Unix / Linux | date +%s -d"Jan 1, 1970 00:00:01" |
VBScript / ASP | DateDiff("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 = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
Set Registry = GetObject(_
"winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default: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方法进行了转换。