如何在C#中将byte[]转换为日期时间?

13

我在数据库中有一个TimeStamp类型的字段,在C#代码中被转换为byte[],我需要将其转换为DateTime值。因此,我想将字节数组转换为DateTime。

已经使用了以下代码:

byte[] byteValue = someValue;
long longVar = BitConverter.ToInt64(byteValue);
DateTime dateTimeVar = DateTime.FromBinary(longVar);

这样可以吗?


4
你一开始为什么要将时间戳转换为byte[]? - Srinivas Reddy Thatiparthy
1
不知道byte[]来自哪里,你可能需要处理字节序问题。 - Ankur Goel
这取决于你所说的“好”。我从未尝试过这种方法,但它似乎不是从数据库检索日期和时间的特别直观的方式。 - Amish Programmer
你没有提到你从哪个数据库服务器获取这个信息。我假设是SQL Server(特别是如果你的数据访问层没有自动转换为DateTime值)。 - Damien_The_Unbeliever
@Srinivas,这不是我的决定,而是由第三方工具生成代码完成的,例如CodeSmith。 - george_test
2个回答

14

SQL Server中的时间戳列(现在称为rowversion)不能转换为datetime值——它只是由服务器分配的单调递增值。


所以,这与日期时间无关?那么它用于什么,特别是为什么与日期时间值或概念相关联?(也许问题不太准确,但一直以来我都相信,不确定是否在某个地方读到过,它在某种程度上与日期时间相关。) - george_test
4
基本上,它的命名不太准确,这就是为什么现在更正确地称之为“rowversion”,而不是“timestamp”。在 SQL Server 中,它与时间没有任何关系,除了像已经描述的那样单调递增。 - Marc Gravell
谢谢,再次感谢。我添加了另一列日期类型,并且现在我可以用它来满足我的需求。 - george_test
问题是关于MySQL而不是MS-SQL! - Ahmed Suror

10
不,那不正确。 FromBinary方法接受一个使用ToBinary方法创建的长整型值。它包含了KindTicks组件,而这不是数据库时间戳所包含的内容。
使用BitConverter获取长整型值是正确的,但是你需要把时间戳的起始时间加上长整型值作为正确的单位。假设它是来自MySQL数据库的时间戳,据我所知它是从1980年1月1日开始算起的毫秒数。
long longVar = BitConverter.ToInt64(byteValue, 0);
DateTime dateTimeVar = new DateTime(1980,1,1).AddMilliseconds(longVar);

谢谢Guffa,我正在尝试这个。 - george_test
BitConverter 方法缺少 startIndex 参数。应该使用 BitConverter.ToInt64(byteValue, 0)。 请查看 https://msdn.microsoft.com/zh-cn/library/system.bitconverter.toint64(v=vs.110).aspx。 - Ali Hasan
@AliHasan:当然可以。感谢你指出来,我已经更正了答案。 - Guffa
它报错了: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); 有什么帮助吗? - Ahmed Suror
@AhmedSuror:你所拥有的并不是一个时间戳,它不能像原帖作者所经历的那样转换成字节。在 longVar 中的值太大了,无法得到一个有效日期,因此它代表了超过 8000 年的毫秒数。可以肯定的是,这实际上不是毫秒数。 - Guffa

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