Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#如何将datetime转换为4字节的字节数组_C# - Fatal编程技术网

c#如何将datetime转换为4字节的字节数组

c#如何将datetime转换为4字节的字节数组,c#,C#,我尝试将其转换为字节数组,但创建了最小为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个字节。尝试使用以下代码: byte[] b = new byte[]

我尝试将其转换为字节数组,但创建了最小为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个字节。

尝试使用以下代码:

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

将当前时间转换为64位unix时间,然后手动将64位时间转换为32位时间(准备好面对2038年的问题)

请参见SO讨论,了解如何做到这一点:

其他参考资料:


您可以使用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个字节根本不够。所以你要么牺牲射程要么牺牲精度<代码>日期时间支持以100ns的步长从第1年到9999年的日期。这需要8个字节…或者增加存储它的内容的大小。在4中完成datetimebytes@user3229083在不牺牲某些东西的情况下,无法将
DateTime
放入4个字节。它被设计成可以容纳8个字节,而不是4个字节。这是一个你无法回避的数学限制。这就像在一个位中尝试4个不同的值。例如,如果将精度降低到1秒,则得到的范围约为130年,这是unix时间戳选择的折衷。dat仅存储从GetByte(t.ticks)接收的8字节中的前4字节。。。其他4个字节丢失。如何将其反转回来?从4字节数组到DataTimes,如下所示(在解决方案中);DateTime tCompare=epoch.AddSeconds(位转换器.ToInt32(b,0));