Как преобразовать байт [] в дату и время в С#?

У меня есть поле типа TimeStamp в базе данных, которое преобразуется в byte[] в коде С#, и мне нужно преобразовать его в значение DateTime. Итак, я хочу преобразовать массив байтов в DateTime.

Этот код уже использовался:

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

это нормально?


person george_test    schedule 16.02.2010    source источник
comment
Почему вы изначально преобразовали временную метку в byte[]?   -  person Srinivas Reddy Thatiparthy    schedule 16.02.2010
comment
Не зная, откуда взялся byte[], вам, возможно, придется иметь дело с проблемами порядка следования байтов.   -  person Ankur Goel    schedule 16.02.2010
comment
Это зависит от того, что вы подразумеваете под ок. Я никогда не пробовал этот подход, но он не кажется особенно интуитивным способом получения даты и времени из базы данных.   -  person Amish Programmer    schedule 16.02.2010
comment
Вы не указываете, с какого сервера базы данных вы это получаете. Я предположил, что SQL Server (особенно если ваш уровень доступа к данным не преобразуется автоматически в значение DateTime)   -  person Damien_The_Unbeliever    schedule 16.02.2010
comment
@Srinivas, это было не мое решение, это делается сторонними инструментами, которые генерируют код, например, codesmith.   -  person george_test    schedule 16.02.2010


Ответы (2)


Нет, это неправильно.

Метод FromBinary принимает длинное значение, созданное с помощью метода ToBinary. Он содержит компоненты Kind и Ticks, и это не то, что содержит временная метка базы данных.

Использование BitConverter для получения длинного значения правильно, но тогда вы должны взять начало времени для метки времени и добавить длинное значение в качестве правильной единицы. Предполагая, что это временная метка из базы данных MySQL, IIRC - это количество миллисекунд с 1980-01-01:

long longVar = BitConverter.ToInt64(byteValue, 0);
DateTime dateTimeVar = new DateTime(1980,1,1).AddMilliseconds(longVar);
person Guffa    schedule 16.02.2010
comment
спасибо, Гуффа, сейчас попробую - person george_test; 16.02.2010
comment
Параметр startIndex отсутствует в методе BitConverter. Это должно быть BitConverter.ToInt64(byteValue, 0) Проверьте msdn.microsoft.com/en-us/library/ - person Ali Hasan; 08.09.2015
comment
@AliHasan: Да, конечно. Спасибо, что заметили это, я исправил ответ. - person Guffa; 08.09.2015

Столбец отметки времени в SQL Server (теперь он называется rowversion) не может быть преобразован. к значению даты и времени - это чисто монотонно возрастающее значение, назначаемое сервером.

person Damien_The_Unbeliever    schedule 16.02.2010
comment
так это не имеет отношения к дате и времени? так почему он используется, особенно, почему он связан со значениями даты и времени или концепцией? (может быть, вопрос не совсем точен, но все это время я верил, не уверен, что читал где-то, что это как-то связано с datetime) - person george_test; 16.02.2010
comment
@george_test - по сути, это плохое имя, поэтому теперь его правильнее называть версией строки, а не отметкой времени. Оно (в SQL Server) не связано со временем вообще, за исключением того, что (как уже было описано) монотонно увеличивается. - person Marc Gravell; 16.02.2010
comment
thnx thnx и еще раз спасибо. Я добавил еще один столбец типа даты, и теперь я использую его для своих целей. - person george_test; 16.02.2010