根据https://msdn.microsoft.com/en-us/library/windows/desktop/ms724290(v=vs.85).aspx,文件时间是64位值,表示自上午12点以来经过的100纳秒间隔的数量。 1601年1月1日协调世界时(UTC)。
要在SystemTime
和FileTime
之间进行转换,可以使用Windows API函数SystemTimeToFileTime
和FileTimeToSystemTime
。
我可能在这里遗漏了一些东西,因为我不认为这是一个太罕见的任务。但是,搜索[.net] systemtimetofiletime
的搜索结果仅提供一个(投票)答案,而且没有相关问题。
也许只是缺乏关于正确术语的知识,而SystemTimeToFileTime
在.Net世界中被称为非常不同的东西。
无论如何,问题是,如何在.Net中SystemTime
和FileTime
之间进行正确转换?
答案 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的方法。
还是我误解了这个问题?