c# - DateTime.ToBinary() 和 DateTime.ToFileTime() 有何不同?

标签 c# .net datetime winapi c#-4.0

谁能帮忙解释一下DateTime.ToBinary()之间的区别和 DateTime.ToFileTime() ?据我所知,它们似乎总是返回相同的值(至少在处理 UTC 时间时)。同样适用于DateTime.FromBinary()DateTime.FromFileTime() .

我试过使用 Reflector我可以看到一些差异,我只是不明白魔数(Magic Number)的相关性:

public long ToBinary()
{
    if (this.Kind != DateTimeKind.Local)
    {
        return (long) this.dateData;
    }
    TimeSpan utcOffset = TimeZoneInfo.Local.GetUtcOffset(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
    long num2 = this.Ticks - utcOffset.Ticks;
    if (num2 < 0L)
    {
        num2 = 0x4000000000000000L + num2;
    }
    return (num2 | -9223372036854775808L);
}

public long ToFileTime()
{
    return this.ToUniversalTime().ToFileTimeUtc();
}

public long ToFileTimeUtc()
{
    long num = ((this.InternalKind & 9223372036854775808L) != 0L) ? this.ToUniversalTime().InternalTicks : this.InternalTicks;
    num -= 0x701ce1722770000L;
    if (num < 0L)
    {
        throw new ArgumentOutOfRangeException(null, Environment.GetResourceString("ArgumentOutOfRange_FileTimeInvalid"));
    }
    return num;
}

public static DateTime FromFileTime(long fileTime)
{
    return FromFileTimeUtc(fileTime).ToLocalTime();
}

public static DateTime FromFileTimeUtc(long fileTime)
{
    if ((fileTime < 0L) || (fileTime > 0x24c85a5ed1c03fffL))
    {
        throw new ArgumentOutOfRangeException("fileTime", Environment.GetResourceString("ArgumentOutOfRange_FileTimeInvalid"));
    }
    return new DateTime(fileTime + 0x701ce1722770000L, DateTimeKind.Utc);
}

public static DateTime FromBinary(long dateData)
{
    long num2;
    if ((dateData & -9223372036854775808L) == 0L)
    {
        return FromBinaryRaw(dateData);
    }
    long ticks = dateData & 0x3fffffffffffffffL;
    if (ticks > 0x3fffff36d5964000L)
    {
        ticks -= 0x4000000000000000L;
    }
    bool isAmbiguousLocalDst = false;
    if (ticks < 0L)
    {
        num2 = TimeZoneInfo.Local.GetUtcOffset(MinValue, TimeZoneInfoOptions.NoThrowOnInvalidTime).Ticks;
    }
    else if (ticks > 0x2bca2875f4373fffL)
    {
        num2 = TimeZoneInfo.Local.GetUtcOffset(MaxValue, TimeZoneInfoOptions.NoThrowOnInvalidTime).Ticks;
    }
    else
    {
        DateTime time = new DateTime(ticks, DateTimeKind.Utc);
        bool isDaylightSavings = false;
        num2 = TimeZoneInfo.GetUtcOffsetFromUtc(time, TimeZoneInfo.Local, out isDaylightSavings, out isAmbiguousLocalDst).Ticks;
    }
    ticks += num2;
    if (ticks < 0L)
    {
        ticks += 0xc92a69c000L;
    }
    if ((ticks < 0L) || (ticks > 0x2bca2875f4373fffL))
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_DateTimeBadBinaryData"), "dateData");
    }
    return new DateTime(ticks, DateTimeKind.Local, isAmbiguousLocalDst);
}

最佳答案

ToBinary() 和 ToFileTimeUtc() 返回相同的值。 ToBinary 提供一个往返值,一个可以保留 DateTime 属性的 Int64。它使用相同的时基,即 0 年的 1 月 1 日。该值始终为 UTC。第 62 位是为极端极端情况设置的,即 00 年 1 月 1 日附近的本地时间在转换为 UTC 时将为负数(请注意此处的细节 :))。当 Kind 为 UTC 时设置第 63 位。将魔数(Magic Number)转换为十六进制以查看此内容。

ToFileTimeUtc() 使用与 Windows 的 FILETIME 相同的时基,即 1601 年 1 月 1 日。神奇的数字是 1601 年 1 月 1 日凌晨 12 点的滴答数。

关于c# - DateTime.ToBinary() 和 DateTime.ToFileTime() 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014652/

相关文章:

c# - `ClaimsPrincipal.IsInRole` 在声明中期望什么?

c# - 列表框总是返回所选项目的错误值

c# - 当上下文中不存在 where/select 时,在包含 Include 的查询中使用 where/select ?相关表上的Where 是否需要包含?

c# - 是否需要设置 NetworkCredential 域?

sql-server - T-SQL - 每分钟检查日期时间数据中的差距

c# - C# 中的 ComboBox 反射

c# - 为什么 AmazonS3Util.DoesS3BucketExist 始终返回 true?

c# - 监控传出互联网流量

java - 如何重构我的日期/时间以允许根据用户的区域设置日期?

java - 如何从java中的字符串时间戳中提取日期和时间