0

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

要在 和 之间SystemTime进行转换,可以使用FileTimeWindows API 函数SystemTimeToFileTime和。FileTimeToSystemTime

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

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

无论如何,问题是,我如何在.NetSystemTime之间正确转换?FileTime

4

3 回答 3

2

声明 PInvoke 函数并调用它。

//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 代码将是正确的并且可以复制。

于 2018-05-30T12:18:08.867 回答
0

我正在尝试将 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
于 2021-12-17T19:39:59.843 回答
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 的方法。

还是我误解了这个问题?

于 2018-08-14T21:38:19.990 回答