繁体   English   中英

奇数日期/时间格式

[英]Odd Date/Time format

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

该值可能是Unix时间戳,它是自1970年1月1日午夜(UTC)起经过的秒数

您可以按以下方式将此值转换为本地时间的[datetime]实例:

[DateTimeOffset]::FromUnixTimeSeconds(1533407816).LocalDateTime

要获取UTC [datetime]实例,请使用.UtcDateTime

或者,直接使用[DateTimeOffset]::FromUnixTimeSeconds()返回的[System.DateTimeOffset]实例。

注意:

  • Unix时间戳以秒为单位签名为32位整数( [int] )。
    2038一句,这意味着它们可以表示的最晚日期是2038 ,这是2038年问题的局限性。

  • 相比之下, [datetime]实例的分辨率为100纳秒 (称为ticks) ,存储在.Ticks属性中,该属性的类型为[long][System.Int64]一个有符号的64位整数)。 要将秒手动转换为刻度,请将它们乘以10000000L1e7L )。

简单的辅助功能

function convertFrom-UnixTime {
  param([int] $Value)
  [DateTimeOffset]::FromUnixTimeSeconds($Value).LocalDateTime
}

实际上,在美国东部时区 ,使用en-US文化:

PS> convertFrom-UnixTime 1533407816

Saturday, August 4, 2018 2:36:56 PM

协调世界时(UTC)en-US文化)表示:

PS> (convertFrom-UnixTime 1533407816).ToUniversalTime()

Saturday, August 4, 2018 6:36:56 PM

对我来说,这个奇怪的值看起来像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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM