将Windows文件时间转换为日期时间

本文关键字:时间 日期 转换 文件 Windows | 更新日期: 2023-09-27 18:02:36

我有一个时间戳,其值为634876488000000000,预期日期为04th November 2012, 18:00:00。当我转换它时,年是3612而不是2012(日,月和时间都是正确的)。

下面是一个例子:

Console.WriteLine(DateTime.FromFileTimeUtc(634876488000000000).ToString());
Console.WriteLine(DateTime.FromFileTime(634876488000000000).ToString());

输出:


04/11/3612 18:00:0004/11/3612 18:00:00

经过进一步的研究,我发现如果我在Powershell中使用Get-Date 634876488000000000,我得到了04 November 2012 18:00:00的正确的预期日期。

谁能解释如何正确地转换时间戳到。net DateTime对象使用c#请?

将Windows文件时间转换为日期时间

我的第一个猜测是这个数字是DateTime。蜱,只是尝试以下在Visual studio和我得到。{04/11/2012 6:00:00 PM}:

DateTime dt = DateTime.MinValue.AddTicks(634876488000000000);

或者使用DateTime构造函数,它将tick作为参数。

DateTime dt = new DateTime(634876488000000000);

API中定义的一个合适的Windows FILETIME是自1601年1月1日午夜UTC以来的刻度数。即1601-01-01T00:00:00Z。这似乎不是你所拥有的。这就是为什么你差了1601年。

你似乎有从0001年1月1日午夜开始的滴答数。这就是Get-Date所使用的,也是DateTime的单个整数构造函数所使用的。

DateTime ntepoch = new DateTime(1601,1,1,0,0,0,DateTimeKind.Utc); // Ticks is 504911232000000000
Console.WriteLine(DateTime.FromFileTimeUtc(634876488000000000 - ntepoch.Ticks));
Console.WriteLine(DateTime.FromFileTime(634876488000000000 - ntepoch.Ticks));
Console.WriteLine(new DateTime(634876488000000000)));

对于我来说,在时区GMT-5中,这输出:

11/4/2012 6:00:00 PM
11/4/2012 1:00:00 PM
11/4/2012 6:00:00 PM

您可以使用DateTime(长刻度)构造函数来获得正确的日期:

Console.WriteLine((new DateTime(634876488000000000)).ToString());