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

标签 c# datetime

我想将 DateTimeDate 部分序列化为 4​​ 个字节(可以是 Int32)。最快的方法是什么?

背景:为了序列化一个完整的DateTime,到目前为止我一直在使用ToBinary 方法。它返回一个我存储在别处的 Int64。现在,我需要仅使用一半的空间来存储 DateTimeDate 部分。因此,我想知道如何以最快的方式实现这一目标,因为性能至关重要。

我想到的选项是:

  • 通过使用一些乘法和属性访问将年、月、日编码为 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/

相关文章:

c# - 如何查看 System.Math.Sin 的源代码?

java - 将一天中的秒数解析为日期字符串的一部分

c# - 创建拉伸(stretch) Canvas View 的方法

c# - 文件复制无法创建同名文件

c# - 将实体数据模型导入项目的最佳方法

javascript日期时区问题

php - 是否可以从偏移量创建 DateTimeZone?

javascript - 在 JavaScript 中将 RFC 1123 日期格式转换为正常日期时间

python - 在 python 中将随机字符串转换为日期会引发组名 'm' 的重新定义

C# 字典相当于 Python 的 get() 方法