将DateTime的Date部分序列化为4个字节的最快方法?

Dej*_*jan 1 c# datetime

我想将Date一部分序列DateTime化为4个字节(可能是Int32).最快的方法是什么?

背景:为了序列化一个完整的DateTime我到目前为止一直在使用该ToBinary方法.它返回Int64我在其他地方存储的内容.现在,我只储存要求Date的部分DateTime只使用一半的空间.所以,我想知道如何以最快的方式实现这一点,因为性能至关重要.

我想到的选项是:

  • int通过使用一些乘法和属性访问来编码年,月,日和YYYYMMDD,这种编码是人类可读的良好副作用.
  • 继续使用ToBinary并保留返回的"上半部分或下半部分" long.不知道是否可能.
  • 检查DateTime内部存储方式.也许可以通过其他方式访问日期部分.

你会怎么做?

Jas*_*ins 7

DateTimes被存储为自0001年1月1日00:00:00以来的刻度数.因此,如果您使用DateTime Ticks并除以它TimeSpan.TicksPerDay,则最终得到自0001年1月1日以来的天数.

反向操作(乘以TimeSpan.TicksPerDay)反序列化时.

由于在该范围内"仅"3,652,058天DateTime,因此很容易适合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
Run Code Online (Sandbox Code Playgroud)

反序列化:

int days;
long ticks = days * System.TimeSpan.TicksPerDay;
System.DateTime deserialized = new DateTime(ticks);
Run Code Online (Sandbox Code Playgroud)