奇数日期/时间格式

时间:2018-08-20 18:47:13

标签: powershell datetime registry

我的“卸载”注册表项中有一个程序,日期/时间是奇数。报告的值为“ 1533407816”,但实际日期很可能为“ 20180804”,这是当天安装的所有其他Autodesk产品报告的日期。 我正在使用[datetime]::ParseExact($program.GetValue('InstallDate'),'yyyyMMdd',$null)将这些日期转换为适当的DateTime,但不确定我需要哪种机制来处理奇数。甚至是有意义的数据。

2 个答案:

答案 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位整数)。要将秒手动转换为滴答,请将它们乘以10000000L1e7L)。

简单的辅助功能

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