我想将 DateTime
的 Date
部分序列化为 4 个字节(可以是 Int32)。最快的方法是什么?
背景:为了序列化一个完整的DateTime
,到目前为止我一直在使用ToBinary
方法。它返回一个我存储在别处的 Int64
。现在,我需要仅使用一半的空间来存储 DateTime
的 Date
部分。因此,我想知道如何以最快的方式实现这一目标,因为性能至关重要。
我想到的选项是:
- 通过使用一些乘法和属性访问将年、月、日编码为 YYYYMMDD 并将
int
编码为人类可读的良好副作用。 - 继续使用
ToBinary
并仅保留返回的long
的“上半部分或下半部分”。不知道这是否可能。 - 检查
DateTime
是如何在内部存储的。也许可以通过其他方式访问日期部分。
你会怎么做?
最佳答案
DateTime
存储为自 0001 年 1 月 1 日 00:00:00 以来的滴答数。因此,如果您采用 DateTime 的 Ticks
并将其除以 TimeSpan.TicksPerDay
,您最终得到自 0001 年 1 月 1 日以来的天数。
在反序列化时反转操作(乘以TimeSpan.TicksPerDay
)。
由于 DateTime
涵盖的范围内“只有”3,652,058 天,因此这很容易适合 Int32
序列化:
System.DateTime toSerialize;
long longDays = toSerialize.Ticks / System.TimeSpan.TicksPerDay;
// Safe since (DateTime.MaxValue - DateTime.MinValue).Days << Int32.MaxValue
int days = (int)longDays;
// Serializes `days` however you would serialize any other int
反序列化:
int days;
long ticks = days * System.TimeSpan.TicksPerDay;
System.DateTime deserialized = new DateTime(ticks);
关于c# - 将 DateTime 的 Date 部分序列化为 4 个字节的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30243541/