2010-07-28 15 views
76

Estoy tratando de convertir una variable C# DateTime a tiempo Unix, es decir, el número de segundos desde el 1 de enero de 1970. Parece que DateTime se implementa realmente como el número de 'ticks' desde el 1 de enero de 0001.¿Cómo puedo convertir un DateTime en la cantidad de segundos desde 1970?

mi pensamiento actual es restar 1 ª Ene, 1970. Tras calificarse a mi DateTime como esto:

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0)); 
return span.TotalSeconds; 

¿hay una mejor manera?

Respuesta

137

Eso es básicamente. Estos son los métodos que utilizo para convertir ay desde Unix efeméride:

public static DateTime ConvertFromUnixTimestamp(double timestamp) 
{ 
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
    return origin.AddSeconds(timestamp); 
} 

public static double ConvertToUnixTimestamp(DateTime date) 
{ 
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
    TimeSpan diff = date.ToUniversalTime() - origin; 
    return Math.Floor(diff.TotalSeconds); 
} 
+1

Debe ser la pena señalar que si se desea convertir a millseconds, ya sea para marcas de tiempo más precisos o Javascript Compatibilidad con el objeto Date(), debe usar long en lugar de int para el tipo de marca de tiempo. – Soviut

+3

No funcionó para mí. Esta respuesta hizo el truco: http://stackoverflow.com/questions/249760/how-to-convert-unix-timestamp-to-datetime-and-vice-versa – Zeezer

+0

@Jonny - ToUniversalTime() convierte a UTC, por lo que no cuenta para UTC. –

21

La única cosa que veo es que se supone que es desde la medianoche Ene 1, 1970 UTC

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc)); 
return span.TotalSeconds; 
+4

¿Debería ser DateTime.UtcNow? – oferei

0

Usted puede crear un startTime y endTime de DateTime, luego endTime.Subtract (startTime). Luego da salida a tu span.Segundos.

Creo que debería funcionar.

13

es probable que desee utilizar DateTime.UtcNow para evitar problema zona horaria

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 
1

Ese enfoque será bueno si la fecha-hora en cuestión es en UTC, o representa el tiempo local en una zona que nunca se ha observado horario de verano. Las rutinas de diferencia de DateTime no tienen en cuenta el horario de verano y, en consecuencia, considerarán la medianoche del 1 de junio como un múltiplo de 24 horas después de la medianoche del 1 de enero. No conozco nada en Windows que informe las reglas históricas de ahorro de luz diurna configuración regional, por lo que no creo que haya una buena manera de manejar correctamente en cualquier momento antes del cambio más reciente de la regla de ahorro de luz diurna.

21

Si el resto de su sistema está bien con DateTimeOffset en lugar de DateTime, hay una característica muy conveniente:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds(); 
+5

Esta es una manera más limpia, pero solo está disponible en el marco 4.6 https://msdn.microsoft.com/en-us/library/system.datetimeoffset.tounixtimeseconds(v=vs.110).aspx –

Cuestiones relacionadas