FILETIME在C#中的实现

本文关键字:实现 FILETIME | 更新日期: 2023-09-27 18:19:55

我正在尝试将一些C++项目转换为C#。我现在正在为我在C++中遇到的一个时间类而挣扎。它有如下方法:

const RsDateTime& RsDateTime::GetTime()
{
    FILETIME ft;
    ::GetSystemTimeAsFileTime(&ft);
    ::FileTimeToLocalFileTime(&ft, &m_Time); // Why call to local time? What does it do?
    return *this;
}
FILETIME RsDateTime::GetUTCTimeAsFile() const
{
    FILETIME ft;
    ::LocalFileTimeToFileTime(&m_Time, &ft); // Why call to local time?
    return ft;
}
static unsigned __int64 GetAsUINT64(const FILETIME* ft)
{
    ULARGE_INTEGER li;
    li.LowPart = ft->dwLowDateTime;
    li.HighPart = ft->dwHighDateTime;
    return li.QuadPart;
}

有人能帮助我如何将其转换为C#吗?我需要使用哪些方法?此外,如上所述,FileTimeLocalFileTime之间的区别是什么?

FILETIME在C#中的实现

在Win32(这段代码似乎就是)中,FILETIME是:

一个64位值,表示自1601年1月1日(UTC)以来的100纳秒间隔数。

除非您依赖于1601 epoch,否则在C#/.NET中只需使用DateTime类型,它包含:

此属性的值表示自0001年1月1日午夜12:00:00以来经过的100纳秒间隔数。

我的建议是完全放弃/忽略C++代码,除非您知道它返回的数据正在某个依赖Win32 FILETIME的地方使用,特别是如果不知道,请删除代码并使用System.DateTime

DateTime C#类现在有一个方法FromFileTime,它将64位FILETIME结构转换为DataTime对象。此时,您可以在c#中正常使用所有DateTime方法和属性。

Int64 exampleTime = 0x01cff7924ade4400L; 
DateTime dtModified = DateTime.FromFileTime(exampleTime);