我的“卸载”注册表项中有一个程序,日期/时间是奇数。报告的值为“ 1533407816”,但实际日期很可能为“ 20180804”,这是当天安装的所有其他Autodesk产品报告的日期。
我正在使用[datetime]::ParseExact($program.GetValue('InstallDate'),'yyyyMMdd',$null)
将这些日期转换为适当的DateTime,但不确定我需要哪种机制来处理奇数。甚至是有意义的数据。
答案 0 :(得分:5)
该值很可能是Unix time戳记,它是自1970年1月1日午夜(UTC)起经过的秒的数量。
您可以按照以下方式在 local 时间将此值转换为[datetime]
实例:
[DateTimeOffset]::FromUnixTimeSeconds(1533407816).LocalDateTime
要获取UTC [datetime]
实例,请使用.UtcDateTime
。
或者,直接使用[System.DateTimeOffset]
返回的[DateTimeOffset]::FromUnixTimeSeconds()
实例。
注意:
Unix时间戳是在秒中以带符号的32位整数([int]
)。
顺便说一句,这意味着它们可以表示的最新日期是年份2038
,这是一个限制Year 2038 problem。
相比之下,[datetime]
实例的分辨率为 100纳秒,称为 ticks ,存储在.Ticks
属性中,其属性类型是[long]
([System.Int64]
一个带符号的64位整数)。要将秒手动转换为滴答,请将它们乘以10000000L
(1e7L
)。
简单的辅助功能:
function convertFrom-UnixTime {
param([int] $Value)
[DateTimeOffset]::FromUnixTimeSeconds($Value).LocalDateTime
}
实际上,在Eastern Time Zone中使用en-US
文化:
PS> convertFrom-UnixTime 1533407816
Saturday, August 4, 2018 2:36:56 PM
以Coordinated Universal Time (UTC)(en-US
文化)表达:
PS> (convertFrom-UnixTime 1533407816).ToUniversalTime()
Saturday, August 4, 2018 6:36:56 PM
答案 1 :(得分:1)
对我来说,这个奇怪的值看起来像一个Unix时间戳。
这是一个将其转换为正常日期的函数
function ConvertFrom-UnixTimeStamp([Int64]$unixTimeStamp, [switch]$asUtc) {
if ($unixTimeStamp -gt 253402430399) {
Write-Error "Cannot convert $unixTimeStamp to DateTime. Only integer values up to 253402430399 are valid."
}
elseif ($unixTimeStamp -gt [Int32]::MaxValue) {
Write-Warning "The given value exceeds the [Int32]::MaxValue and therefore enters the Year2038 Unix bug.."
}
[DateTime]$origin = New-Object System.DateTime 1970, 1, 1, 0, 0, 0, 0, Utc
if ($asUtc) { return $origin.AddSeconds($unixTimeStamp) }
return ($origin.AddSeconds($unixTimeStamp)).ToLocalTime()
}
ConvertFrom-UnixTimeStamp 1533407816 -asUtc
将产生一个DateTime对象:
2018年8月4日星期六18:36:56