将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#请?
我的第一个猜测是这个数字是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());