Domanda
Ciao
Ho un database legacy con un campo contenente un numero intero che rappresenta un datetime in UTC
Dalla documentazione: " I timestamp all'interno di un CDR vengono visualizzati in Universal Coordinated Time (UTC). Questo valore rimane indipendentemente dalle modifiche dell'ora legale "
Un esempio di valore è 1236772829.
La mia domanda è qual è il modo migliore per convertirlo in .NET DateTime (nel codice CLR, non nel DB), sia come valore UTC che come valore di ora locale.
Ho provato a cercarlo su Google ma senza fortuna.
Grazie in anticipo / Johan
Soluzione
Cercare su Google quella frase esatta mi dà questa pagina Cicso , che continua dicendo" Il campo specifica un valore time_t ottenuto dal sistema operativo. & Quot;
time_t è un concetto di libreria C che in senso stretto non deve essere particolare implementazione, ma tipicamente per i sistemi UNIX-y sarà il numero di secondi dall'inizio dell'era Unix, 1970 gennaio 1 00:00.
Supponendo che sia giusto, questo codice ti darà un DateTime da un int:
DateTime epochStart = new DateTime(1970, 1, 1);
int cdrTimestamp = 1236772829;
DateTime result = epochStart.AddSeconds(cdrTimestamp);
// Now result is 2009 March 11 12:00:29
Dovresti controllare la sanità mentale dei risultati ottenuti per confermare che questa è l'interpretazione corretta di questi time_t
s.
Altri suggerimenti
Dovrai sapere cosa significa veramente l'intero. Generalmente consisterà in:
- Un'epoca / offset (ovvero cosa significa 0), ad esempio "mezzanotte del 1 ° gennaio 1970"
- Una scala, ad es. secondi, millisecondi, zecche.
Se puoi ottenere due valori e cosa significano in termini di UTC, il resto dovrebbe essere facile. Il modo più semplice sarebbe probabilmente avere un DateTime
(o DateTimeOffset
) come epoca, quindi costruire un TimeSpan
dall'intero, ad es. TimeSpan.FromMilliseconds
ecc. Aggiungi i due insieme e il gioco è fatto. EDIT: utilizzando AddSeconds
o AddMilliseconds
secondo la risposta di aakashm è un modo più semplice di fare questo bit :)
In alternativa, esegui l'aritmetica e chiama DateTime costruttore che richiede un numero di tick
. (Probabilmente anche la versione che prende un DateTimeKind
sarebbe migliore, quindi puoi dichiarare esplicitamente che è UTC.)