2010-02-16 35 views
9

Tengo un campo de tipo TimeStamp en la base de datos, que se convierte en byte [] en código C#, y necesito convertirlo al valor DateTime. Así que quiero convertir de una matriz de bytes a DateTime.¿Cómo convertir un byte [] en datetime en C#?

ya se utiliza este código:

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

es esta bien?

+4

¿Por qué a convertir fecha y hora a byte [] en el primer lugar? –

+1

Sin saber de dónde viene el byte [], es posible que tenga que lidiar con problemas de endianness. –

+0

Eso depende de lo que quiere decir con "ok". Nunca he intentado este enfoque, pero no parece una forma particularmente intuitiva de recuperar una fecha y hora de una base de datos. –

Respuesta

6

No, eso no es correcto. El método FromBinary toma un valor largo creado con el método ToBinary. Contiene los componentes Kind y Ticks, y esto no es lo que contiene una marca de tiempo de la base de datos.

El uso del BitConverter para obtener el valor largo es correcto, pero luego debe tomar el origen temporal de la marca de tiempo y agregar el valor largo como la unidad correcta. Asumiendo que es una marca de tiempo a partir de una base de datos MySQL, IIRC es el número de milisegundos desde 1980-01-01:

long longVar = BitConverter.ToInt64(byteValue, 0); 
DateTime dateTimeVar = new DateTime(1980,1,1).AddMilliseconds(longVar); 
+0

thnx Guffa, estoy intentando esto ahora –

+0

El parámetro startIndex falta en el método BitConverter. Debe ser BitConverter.ToInt64 (byteValue, 0) Verificar https://msdn.microsoft.com/en-us/library/system.bitconverter.toint64(v=vs.110).aspx –

+0

@AliHasan: Sí, de curso. Gracias por detectar eso, corregí la respuesta. – Guffa

13

Una columna de marca de tiempo en SQL Server (ahora llamada rowversion) no se puede convertir a un valor de fecha y hora; es simplemente un valor incremental monótonamente asignado por el servidor.

+0

entonces, ¿no tiene que ver con datetime? Entonces, ¿por qué se utiliza, especialmente, por qué está asociado con valores de fecha y hora o concepto? (Tal vez la pregunta no es del todo exacta, pero todo este tiempo lo había creído, no estoy seguro si lo he leído en alguna parte, que estaba relacionado de alguna manera con datetime) –

+4

@george_test - básicamente, está mal nombrado - que es por lo que ahora se llama más correctamente "rowversion", no "timestamp". No se relaciona (en SQL Server) con el tiempo * en absoluto *, aparte de ser monótonamente creciente (como ya se ha descrito). –

+0

thnx thnx y thnx nuevamente. Agregué otra columna de tipo de fecha y ahora la uso para mis propósitos. –