提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

我们在安装Windows系统时,系统已经给我们将第一次初始装机的日期写入到注册表中,以便于我们以后备查,最通常的做法是开始-运行-输入cmd确定,打开命令提示符,输入 systeminfo 这个命令,然后就会获取初始安装日期。那么这个日期究竟保存在注册表什么地方呢?

使用regedit打开注册表编辑器,定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 分支,在右边键值中找到 InstallDate ,对的这个就是我们要找的安装日期。

注册表系统安装日期.png

我们双击这个日期,这时注册表显示“编辑 DWORD 值”对话框,默认基数是16进制的,我们先改成10进制的,什么?看不懂这个时间?先不急,这个是Unix时间戳,接下来我就要介绍这个。

查看或编辑注册表系统安装日期.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 ) → 普通时间?

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 ))"
如何在不同编程语言中实现普通时间 → Unix时间戳( 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方法进行了转换。