2011-07-03 19 views
5

Non so perché questo è così complicato!C# convertire UTC int nell'oggetto DateTime

Ho un plug-in che sta passando in un UTC lungo int. Devo convertire quel numero in un DateTime per interrogare il mio database (SQL Server).

Non so perché, ma non riesco a trovare una risposta praticabile da una ricerca di base su google.

(Per il credito in più, ho bisogno di trasformare il mio tornato DateTime di nuovo in un UTC, alla fine della giornata.)

Questo è imbarazzante dover fare una domanda così semplice! :)

+1

di * UTC int *, vuoi dire qualcosa come secondi dall'epoca? – bzlm

risposta

19

La mia ipotesi è che sta per essere o millisecondi o secondi dal un'epoca particolare - molto probabilmente l'epoca Unix del 1 ° gennaio 1970, a mezzanotte UTC.

modo che il codice sarebbe simile:

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 
                  DateTimeKind.Utc); 

public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds) 
{ 
    return UnixEpoch.AddMilliseconds(milliseconds); 
} 

Apportare le modifiche ovvie per secondi, o da un'epoca diversa :)

Un approccio alternativo è quello di creare un TimeSpan dei secondi/millisecondi dal momento che l'epoca, e poi aggiungerlo al l'epoca:

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 
                  DateTimeKind.Utc); 

public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds) 
{ 
    return UnixEpoch + TimeSpan.FromMilliseconds(milliseconds); 
} 

non so di alcuna differenza significativa tra i due - anche se il fatto che AddMilliseconds prende un double anziché un long suggerisce che per valori molto grandi, l'approccio TimeSpan può essere preferibile. Dubito che farà comunque alcuna differenza :)

+1

Grazie !!!! Questo è esattamente ciò di cui avevo bisogno. –

9

L'int si ottiene secondi, millisecondi o cosa? Dopo averlo convertito in tick, (un tick di .NET è 100 nanosecondi) ad es. da long ticks = theDBDateNum*TimeSpan.TicksPerMillisecond;, provate questo:

DateTime theDate = new DateTime(ticks, DateTimeKind.Utc); 
+1

Questo presuppone un'epoca che è uguale a quella di .NET - che sembra improbabile nella mia esperienza. –

+0

Sì. Passa pochi secondi dall'epoca. –

Problemi correlati