从Windows文件时间转换为DateTime

时间:2013-03-06 11:39:54

标签: c# .net datetime time

我的时间戳的值为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:00
  04/11/3612 18:00:00

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

有人能解释如何使用C#将时间戳正确转换为.NET DateTime对象吗?

3 个答案:

答案 0 :(得分:6)

我的第一个猜测是这个数字是DateTime.Ticks,只是在Visual Studio中尝试了以下内容而我得到了。 {04/11/2012 6:00:00 PM}表示:

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

或者使用带有刻度的DateTime Constructor作为参数。

DateTime dt = new DateTime(634876488000000000);

答案 1 :(得分:1)

正确的Windows FILETIME as defined in the API是自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

答案 2 :(得分:0)

您可以使用DateTime(长标记)构造函数来获取正确的日期:

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