我的时间戳的值为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对象吗?
答案 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());