在.Net中,如何在SystemTime和FileTime之间进行转换?

时间:2018-05-30 12:13:26

标签: .net datetime-conversion systemtime filetime

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

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

我可能在这里遗漏了一些东西,因为我不认为这是一个太罕见的任务。但是,搜索[.net] systemtimetofiletime的搜索结果仅提供一个(投票)答案,而且没有相关问题。

也许只是缺乏关于正确术语的知识,而SystemTimeToFileTime在.Net世界中被称为非常不同的东西。

无论如何,问题是,如何在.Net中SystemTimeFileTime之间进行正确转换?

2 个答案:

答案 0 :(得分:2)

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代码是正确的,可以随时复制。

答案 1 :(得分:0)

似乎您使它变得太难了。在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的方法。

还是我误解了这个问题?