C#如何将日期时间转换为4字节的字节数组

6
我尝试将它转换为字节数组,但最小的字节数组长度是5。 但我的字节数组中只有4个字节用于存储此日期时间作为字节。
代码如下:
byte[] b = new byte[] {10,12,12,12};
DATETIME t=datetime.now();
array.copy(BitConverter.GetBytes(t.ticks),1,b,4);

但是getbytes(t.ticks)返回8个字节的数组。我希望它只转换为4个字节。


你需要存储仅日期还是整个日期+时间? - Reed Copsey
10
仅使用4个字节是不够的。因此,您需要在范围和精度之间做出取舍。 DateTime 支持以100ns为步长的1年至9999年的日期。这需要8个字节。 - CodesInChaos
1
...或者增加你所存储的内容的大小。 - DonBoitnott
完整的日期时间在4个字节中。 - user3229083
7
你不能将DateTime压缩为4个字节而不牺牲某些东西。它被设计为8个字节,而不是4个字节。这是一个数学上的限制,你无法绕过它。这就像尝试在一个位中放入4个不同的值。例如,如果你将精度降低到1秒,你会得到约130年的时间范围,这是unix时间戳所选择的权衡。 - CodesInChaos
显示剩余3条评论
3个回答

9

您可以使用32位Unix时间。但要注意2038年问题。您可以在下面找到示例解决方案,其中将日期时间存储在4字节中。

        byte[] b = new byte[] { 10, 12, 12, 12 };
        DateTime now = DateTime.Now;
        var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        var csMinDate = DateTime.MinValue;
        TimeSpan tsEpoch = now - epoch;
        int passedSecods = (int)tsEpoch.TotalSeconds;
        byte[] copyBytes = BitConverter.GetBytes(passedSecods);
        Array.Copy(copyBytes, 0, b, 0, 4);
        DateTime tCompare = epoch.AddSeconds(BitConverter.ToInt32(b, 0));

你如何将一个4字节数组反转回DateTime? - HaBo
以下是編程相關內容的翻譯: DateTime tCompare = epoch.AddSeconds(BitConverter.ToInt32(b, 0)); - cahit beyaz

1

-1

尝试使用这段代码:

byte[] b = new byte[] { 10, 12, 12, 12 };
DateTime t = DateTime.Now;
Array.Copy(BitConverter.GetBytes(t.Ticks), 0, b, 0, 4);

dat 只存储从 GetByte(t.ticks) 接收的 8 字节中的前 4 字节... 其他 4 字节会丢失。 - user3229083

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接