2010-10-03 21 views
10

que tienen una función que convierte de vez en tiempo UNIX a un valor .NET DateTime:¿Cómo convierto la hora de la época de Unix y la cuenta en horario de verano en C#?

public static DateTime FromUnixEpochTime(double unixTime) 
{ 
    DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    return d.AddSeconds(unixTime); 
} 

Dónde estoy (Reino Unido) los relojes se adelanta una hora para el verano.

En Python obtengo el tiempo de la Época local usando time.time() (y por el bien del argumento, ahora es la hora 17:15:00) que me da un valor de 1286122500.

Si vuelvo a convertir esto a un tiempo legible por los humanos usando time.localtime() se convierte de nuevo a 17:15 como era de esperar.

Cómo convierto unix epoch time a un .NET DateTime valor Y cuenta para el horario de verano local. Mi función anterior convierte 1286122500 a 16:15, lo cual es incorrecto para mi ubicación geográfica.

Respuesta

20

Uso DateTime.ToLocalTime():

http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

public static DateTime FromUnixEpochTime(double unixTime) 
{ 
    DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    d = d.AddSeconds(unixTime); 
    return d.ToLocalTime(); 
} 
+0

+1, nada más complicado es necesario aquí. –

+0

Ah, ja ... Intenté 'DateTimeKind.Local' en el constructor DateTime, no puedo creer que haya pasado por alto el método' .ToLocalTime() '. – Kev

+0

Viejo pero bueno. Gracias. – kmarks2

1

¿Está a punto de finalizar su horario de verano? Si es así, los archivos de la zona horaria pueden estar desactualizados, pensando que ya han finalizado. (No sé sobre el Reino Unido, pero en los EE. UU., El alcance del ahorro de luz diurna se amplió hace 3 años, y muchas instalaciones aún no tienen los datos actualizados).

En resumen, asegúrese de que su zona horaria los datos están actualizados. :-)

+0

No están desactualizados. También Python obtiene este derecho. – Kev

1

Son las 17:15 para 1286122500 en la zona horaria BST (o GMT + 1) (horario de verano británico).

Su función usa DateTimeKind.Utc que le dice que use UTC (también conocido como GMT), por lo que obtiene un tiempo en GMT: 16:15. Además, no creo que el cambio del huso horario de la referencia de época de UNIX afecte correctamente a su zona horaria local actual.

lugar, usted podría intentar algo como esto:

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
DateTime d = unixEpoch + new TimeSpan(unixTime); 

(y luego convertir a DateTimeKind.Local)

5

La clase TimeZoneInfo es genial en h elping un trato con diferentes tiempos y zonas horarias. Utiliza la información de zona horaria que Windows ha incorporado para convertir entre distintas zonas horarias.

Así es como debería usar este recurso para su problema:

//Get your unix epoch time into a DateTime object 
DateTime unixTime = 
    new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc).AddSeconds(1286122500); 

//Convert to local time 
DateTime localTime = TimeZoneInfo.ConvertTime(unixTime, TimeZoneInfo.Local); 

TimeZoneInfo.Local devuelve el TimeZoneInfo que representa la zona horaria local.

Cuestiones relacionadas