【问题标题】:In .Net, how do I convert between SystemTime and FileTime?在 .Net 中,如何在 SystemTime 和 FileTime 之间进行转换?
【发布时间】:2018-05-30 12:13:25
【问题描述】:

根据https://msdn.microsoft.com/en-us/library/windows/desktop/ms724290(v=vs.85).aspx,文件时间是一个 64 位值,表示自凌晨 12:00 以来经过的 100 纳秒间隔数。 1601 年 1 月 1 日协调世界时 (UTC)。

要在SystemTimeFileTime 之间进行转换,可以使用Windows API 函数SystemTimeToFileTimeFileTimeToSystemTime

我可能在这里遗漏了一些东西,因为我不认为这是一项太罕见的任务。但是,在 SO 中搜索 [.net] systemtimetofiletime 只会提供一个(被否决的)答案,而没有相关问题。

也许这只是缺乏对正确术语的了解,SystemTimeToFileTime 在 .Net 世界中被称为非常不同的东西。

无论如何,问题是,如何在.Net 中正确转换SystemTimeFileTime

【问题讨论】:

  • 很难找到任何东西,因为这是非常不寻常的要求。 DateTime.Now 已经返回系统时间, DateTime.UtcNow 已经返回文件时间, DateTime.ToUniversalTime() 进行转换, DateTime.ToFileTime() 吐出操作系统编号。很难猜到你为什么要问这个问题,给我们看看。
  • @HansPassant,推断DateTime 已经“包装”了一个 SystemTime 是否正确?
  • 没错。

标签: .net datetime-conversion systemtime filetime


【解决方案1】:

Declare the PInvoke function 并调用它。

//Taken from http://www.codeproject.com/csharp/timezoneconversions.asp?print=true
private static DateTime SystemTimeToDateTime(ref SYSTEMTIME st)
{
        FILETIME ft = new FILETIME();
        SystemTimeToFileTime(ref st, out ft);
        DateTime dt = new DateTime((((long)ft.dwHighDateTime) << 32) | (uint)ft.dwLowDateTime);
        return dt;
}

就个人而言,在这种情况下,我会使用反编译器(例如 Reflector)搜索 .NET Framework 以了解现有用法。通常,Microsoft 已经在内部调用了我需要的 API。很可能,他们的 PInvoke 代码是正确的并且可以复制。

【讨论】:

  • 您不必使用反射器。 .NET 参考源可在线获得,并且具有很好的搜索功能:referencesource.microsoft.com
  • 请注意@AaronM.Eshbach。 Reflector 方法的优点是您可以将 1000 个程序集从 C:\ 拉到 Reflector 中,然后查看是否有任何应用程序具有您需要的功能。
【解决方案2】:

看来你做得太难了。在 PowerShell 中,通过 .NET,您可以这样做:

PS C:\Users\luser> ([System.DateTime]"Jan 05,2018").ToFileTime()
131596092000000000

PS C:\Users\luser> ([System.DateTime]::FromFileTime('131596092000000000'))

Friday, January 5, 2018 12:00:00 AM

System.Datetime 有一个 CTOR,它接受您想要提供日期时间的任何类型的格式,然后使用 ToFileTime() 方法获取 int64 值。

同样,Datetime 类有一个方法,可以使用 FromFileTime() 方法将 int64 值转换为 DateTime。

还是我误解了这个问题?

【讨论】:

    【解决方案3】:

    我正在尝试将 FILETIME 从注册表中找到的上下 32 位值转换为上次使用 PowerShell 在 Windows 10 中使用用户配置文件的时间。有什么想法吗?

    计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\SID\

    LocalProfileUnloadTimeHigh = 30901163

    LocalProfileUnloadTimeLow = 4255800258

    [System.DateTime]::FromFileTime('425580025830901163')
        
    Monday, August 11, 2949 7:23:03 AM
    
    [System.DateTime]::FromFileTime('309011634255800258')
     
    Tuesday, March 21, 2580 4:30:25 AM
    

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 2017-03-16
      • 2013-02-15
      • 1970-01-01
      • 2012-11-03
      • 2016-03-09
      • 2020-05-15
      • 1970-01-01
      • 2018-02-22
      相关资源
      最近更新 更多