2010-02-16 20 views
9

Ho un campo di tipo TimeStamp nel database, che viene convertito in byte [] nel codice C# e ho bisogno di convertirlo in valore DateTime. Quindi voglio convertire da una matrice di byte in DateTime.Come convertire un byte [] in datetime in C#?

già utilizzato questo codice:

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

è questo ok?

+4

Perché hai convertire timestamp di byte [] in primo luogo? –

+1

Senza sapere da dove viene il byte [], potrebbe essere necessario affrontare i problemi di endianness. –

+0

Dipende da cosa intendi con "ok". Non ho mai provato questo approccio, ma non sembra un modo particolarmente intuitivo per recuperare una data e un'ora da un database. –

risposta

6

No, non è corretto.

Il metodo FromBinary accetta un valore lungo creato utilizzando il metodo ToBinary. Contiene i componenti Kind e Ticks e questo non è ciò che contiene un timestamp del database.

Utilizzare BitConverter per ottenere il valore lungo è corretto, ma è necessario prendere l'origine dell'orario per il timestamp e aggiungere il valore lungo come unità corretta. Supponendo che sia un timestamp da un database MySQL, IIRC è il numero di millisecondi da 1980-01-01:

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

thx Guffa, sto provando questo ora –

+0

parametro startIndex mancante nel metodo BitConverter. Dovrebbe essere BitConverter.ToInt64 (byteValue, 0) Controllare https://msdn.microsoft.com/en-us/library/system.bitconverter.toint64(v=vs.110).aspx –

+0

@AliHasan: Sì, di corso. Grazie per averlo notato, ho corretto la risposta. – Guffa

13

Una colonna timestamp in SQL Server (ora denominata rowversion) non è convertibile in un valore datetime: è puramente un valore monotonicamente crescente assegnato dal server.

+0

quindi, non ha a che fare con datetime? quindi, perché è usato, soprattutto, perché è associato a valori datetime, o concetto? (forse la domanda non è esattamente esatta, ma per tutto questo tempo ho creduto, non sono sicuro se l'ho letto da qualche parte, che è stato collegato in qualche modo con datetime) –

+4

@george_test - basicamente, è mal chiamato - che è il motivo per cui ora è più correttamente chiamato "rowversion", non "timestamp". Non (in SQL Server) si riferisce al tempo * a tutti *, diverso dall'essere (come già descritto) in aumento monotono. –

+0

thnx thnx e thnx di nuovo. Ho aggiunto un'altra colonna di tipo data, e ora lo uso per i miei scopi. –

Problemi correlati