如何在 C# 中将字节 [] 转换为日期时间?
Posted
技术标签:
【中文标题】如何在 C# 中将字节 [] 转换为日期时间?【英文标题】:How to convert a byte[] into datetime in C#? 【发布时间】:2011-01-17 10:59:46 【问题描述】:我在数据库中有一个 TimeStamp 类型的字段,它在 c# 代码中转换为 byte[],我需要将其转换为 DateTime 值。 所以我想从一个字节数组转换为 DateTime。
已经用过这个代码:
byte[] byteValue = someValue;
long longVar = BitConverter.ToInt64(byteValue);
DateTime dateTimeVar = DateTime.FromBinary(longVar);
这样好吗?
【问题讨论】:
你为什么首先将时间戳转换为字节[]? 在不知道 byte[] 来自哪里的情况下,您可能不得不处理字节序问题。 这取决于您所说的“ok”是什么意思。我从未尝试过这种方法,但从数据库中检索日期和时间似乎不是一种特别直观的方法。 您没有提及您从哪个数据库服务器获取此信息。我假设 SQL Server(特别是如果您的数据访问层没有自动转换为 DateTime 值) @Srinivas,这不是我的决定,它是由生成代码的第三方工具完成的,例如 codesmith。 【参考方案1】:SQL Server(现在称为 rowversion)中的时间戳列不能转换为日期时间值 - 它纯粹是服务器分配的单调递增值。
【讨论】:
所以,它与日期时间无关?那么为什么它被用于,特别是为什么它与日期时间值或概念相关联? (也许这个问题不太准确,但一直以来我一直相信,我不确定我是否在某处读过它,它与日期时间有某种关联) @george_test - 基本上,它的名字很糟糕 - 这就是为什么现在更正确地称为“rowversion”,而不是“timestamp”。它(在 SQL Server 中)与时间完全无关,除了(如前所述)单调递增。 thnx thnx 和 thnx 再次。我添加了另一列日期类型,现在我确实将其用于我的目的。 问题是关于 mysql 而不是 MS-SQL!【参考方案2】:不,这是不正确的。
FromBinary
方法采用使用 ToBinary
方法创建的 long 值。它包含Kind
和Ticks
组件,这不是数据库时间戳包含的内容。
使用BitConverter
获取long 值是正确的,但是你必须以时间戳的时间原点并将long 值添加为正确的单位。假设它是来自 MySQL 数据库的时间戳,IIRC 它是从 1980-01-01 开始的毫秒数:
long longVar = BitConverter.ToInt64(byteValue, 0);
DateTime dateTimeVar = new DateTime(1980,1,1).AddMilliseconds(longVar);
【讨论】:
thnx Guffa,我正在尝试这个 BitConverter 方法中缺少 startIndex 参数。应该是 BitConverter.ToInt64(byteValue, 0) 检查msdn.microsoft.com/en-us/library/… @AliHasan:是的,当然。感谢您发现这一点,我更正了答案。 它给出一个错误:ArgumentOutOfRangeException: Value to add was out of range. (Parameter 'value')
System.DateTime.Add(double value, int scale)
我做了什么:long longVar = BitConverter.ToInt64(Model.UpdatedAt, 0); DateTime updatedAt = new DateTime(1980, 1, 1).AddMilliseconds(longVar);
有什么帮助吗?
@AhmedSuror:你所拥有的不是一个时间戳,它以与原始发布者经历的相同方式转换为字节。 longVar
中的值太大而无法生成有效日期,因此它代表了超过 8000 年的毫秒数。可以肯定地说,它实际上不是毫秒。以上是关于如何在 C# 中将字节 [] 转换为日期时间?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .Net / C# 中将日期转换为 HTTP 格式的日期
如何在 C# 中将日期字符串转换为 DateTime 对象? [复制]