谁能帮忙解释一下两者之间的区别日期时间.ToBinary() http://msdn.microsoft.com/en-us/library/system.datetime.tobinary.aspx and 日期时间.ToFileTime() http://msdn.microsoft.com/en-us/library/system.datetime.tofiletime.aspx?据我所知,它们似乎总是返回相同的值(至少在处理 UTC 时间时)。这同样适用于日期时间.FromBinary() http://msdn.microsoft.com/en-us/library/system.datetime.frombinary.aspx and 日期时间.FromFileTime() http://msdn.microsoft.com/en-us/library/system.datetime.fromfiletime.aspx.
我尝试过使用反射器 http://www.red-gate.com/products/reflector/我可以看到一些差异,我只是不明白幻数的相关性:
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() 执行以下操作not返回相同的值。 ToBinary 提供一个往返值,一个可以保留 DateTime 属性的 Int64。它使用相同的时基,即 0 年 1 月 1 日。该值始终为 UTC。位 62 是针对极端情况而设置的,其中 2000 年 1 月 1 日附近的本地时间在转换为 UTC 时将为负值(注意这里的细节:))。当种类为 UTC 时,设置位 63。将幻数转换为十六进制即可看到这一点。
ToFileTimeUtc() 使用与 Windows FILETIME 相同的时基,即 1601 年 1 月 1 日。神奇数字是 1601 年 1 月 1 日中午 12 点的刻度数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)