我可以得到正确的日期混合Get-Date和[DateTime] :: FromFileTime

时间:2014-04-14 20:25:22

标签: powershell utc datetimeoffset

http://powershell.com/cs/blogs/tips/archive/2014/04/10/converting-ticks-into-real-date.aspx的提示 显示如何将刻度转换为日期。当您提供Get-Date()时,年份值出错。使用[DateTime] :: FromFileTime更新Tics。我想出了UTC的问题,但年份仍然不正确。 Powershell: get-date & [datetime]::FromFileTime returns different values的帖子 显示了最初的问题。似乎这两个计算使用了不同的基值,使计算时间缩短了3600年。这里发生了什么?

PS> [DateTime]::FromFileTime((Get-Date -Date '2014-04-01 18:22:12').Ticks)
Tuesday, April 01, 3614 11:22:12 AM
PS> [DateTime]::FromFileTime(((Get-Date -Date '2014-04-01 18:22:12').ToUniversalTime()).Ticks)
Tuesday, April 01, 3614 6:22:12 PM
PS> [DateTime]::FromFileTimeUTC(((Get-Date -Date '2014-04-01 18:22:12')).Ticks)
Tuesday, April 01, 3614 6:22:12 PM

2 个答案:

答案 0 :(得分:2)

DateTime.TicksFileTime是两个不同的单位。

DateTime.Ticks自0001年1月1日起为100纳秒。

  

此属性的值表示100纳秒的数量   自0001年1月1日午夜12:00:00起经过的间隔,   代表DateTime.MinValue。

然而,

FileTime是自17世纪(1601年1月1日)以来的UTC时间。

  

Windows文件时间是一个64位值,表示数量   自午夜12:00起经过的100纳秒间隔,   1601年1月1日A.D.(C.E。)世界协调时间(UTC)。

所以你的计算总是会错过1600年+/-几个小时。

答案 1 :(得分:2)

(Get-Date -Date' 2014-04-01 18:22:12')。蜱虫给你总蜱数(不是1601年),但是[DateTime] :: FromFiletimeUTC( X)期待数字X从1601开始,因此添加它。

简化:

    (Get-Date '2014-01-01').ticks = 635241312000000000
    (Get-Date '1601-01-01').ticks = 504911232000000000 <--- not ZERO
    [Datetime]::FromFileTimeUtc(0) = Monday, January 1, 1601 12:00:00 AM