3

我有一个带有值的时间戳,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

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

谁能解释一下如何使用 C# 正确地将时间戳转换为 .NET DateTime 对象?

4

3 回答 3

6

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

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

或者使用以刻度为参数的DateTime 构造函数。

DateTime dt = new DateTime(634876488000000000);
于 2013-03-06T11:42:39.963 回答
3

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
于 2018-12-03T17:17:25.507 回答
0

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

Console.WriteLine((new DateTime(634876488000000000)).ToString());
于 2013-03-06T11:43:44.527 回答