2011-07-03 25 views
5

¡No sé por qué es tan complicado!C# convert UTC int al objeto DateTime

Tengo un complemento que está pasando en UTC largo int. Necesito convertir ese número en DateTime para consultar mi base de datos (SQL Server).

No sé por qué, pero no puedo encontrar una respuesta viable de una búsqueda básica de Google.

(Para el crédito adicional, tengo que cambiar mi regresado DateTime de nuevo en una GMT al final del día.)

Esto es vergonzoso tener que hacer una pregunta tan básica! :)

+1

por * UTC int *, ¿te refieres a algo así como segundos desde la época? – bzlm

Respuesta

19

Mi suposición es que va a ser tanto en milisegundos o segundos desde una época determinada - muy posiblemente la época Unix del 1 de enero de 1970, la medianoche UTC.

Así que el código sería algo como:

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); 
} 

Realice los cambios obvios de segundos, o de una época diferente :)

Un enfoque alternativo es crear un TimeSpan de los segundos/milisegundos desde la época y, a continuación, agregarlo a la época:

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); 
} 

no sé de ninguna diferencia significativa entre ellos - a pesar del hecho de que AddMilliseconds toma un double en lugar de un long sugiere que para valores muy grandes, el enfoque TimeSpan puede ser preferible. Dudo que vaya a hacer ninguna diferencia, aunque :)

+1

¡Gracias! Eso es exactamente lo que necesitaba. –

9

¿El int obtiene segundos, milisegundos, o qué? Después de convertirlo en ticks, (un tic de .NET es de 100 nanosegundos) p. por long ticks = theDBDateNum*TimeSpan.TicksPerMillisecond;, intente esto:

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

Eso supone una época que es la misma que la de .NET, parece improbable en mi experiencia. –

+0

Sí. Está pasando segundos desde la época. –

Cuestiones relacionadas