获取系统安装日期与Unix时间戳(Unix timestamp)

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

我们在安装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) → 普通时间?

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代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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方法进行了转换。

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!
请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注