【问题标题】:Convert from a Windows filetime to a DateTime从 Windows 文件时间转换为日期时间
【发布时间】:2013-02-21 04:29: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:00
04/11/3612 18:00:00

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

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

【问题讨论】:

    标签: c# .net datetime time


    【解决方案1】:

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

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

    或者使用DateTime Constructor,它以刻度作为参数。

    DateTime dt = new DateTime(634876488000000000);
    

    【讨论】:

      【解决方案2】:

      正确的 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
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 不是ToString() 多余的..?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        相关资源
        最近更新 更多