2009-05-25 20 views
14

Pude encontrar el código de ejemplo para obtener la marca de tiempo actual en la época de Linux (segundos desde la medianoche del 1 de enero de 1970), pero tengo problemas para encontrar un ejemplo de cómo calcular la Época estar en el futuro, digamos por ejemplo 10 minutos a partir de ahora, entonces ¿cómo puedo calcular un tiempo futuro en Linux Época?Cálculo del tiempo de la Época futura en C#

+0

Usted declara "cómo calcular lo que será la Época en el futuro, digamos por ejemplo 10 minutos a partir de ahora" es confuso. ¡La Época de Unix siempre es 01/01/1970 00:00:00, incluso en 10 minutos! ¿Quiere decir "cómo calcular el número de segundos desde que Unix Epoch estará en el futuro, digamos por ejemplo 10 minutos a partir de ahora" –

Respuesta

28

Este método de extensión debe hacer el trabajo:

private static double GetUnixEpoch(this DateTime dateTime) 
{ 
    var unixTime = dateTime.ToUniversalTime() - 
     new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

    return unixTime.TotalSeconds; 
} 

y se puede usar como tal:

var unixTime1 = DateTime.Now.GetUnixEpoch(); // precisely now 
var unixTime2 = (DateTime.Now + new TimeSpan(0, 10, 0)).GetUnixEpoch(); // 10 minutes in future 

en cuenta que necesita para hacer frente a todas las fecha-hora en UTC (hora universal), ya que así es como se define el inicio de Unix Epoch.

+0

Tenga en cuenta que ToUniversalTime() trata los tiempos con un tipo no especificado como local, que puede o no ser correcto para tu aplicación Es por eso que siempre es mejor especificar el Tipo al crear un DateTime. Consulte http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx –

+0

@Matthew: Sí, es un buen punto (aunque no es algo de lo que preocuparse si solo está utilizando tiempos relativos a Now) Sin embargo, todavía necesita convertir a UTC de todos modos. – Noldorin

+0

Así que finalmente finalmente leo su código y lo entiendo. Desearía poder votar esto 10 veces más. Gracias :) – UnkwnTech

0

La solución básica:

  1. tomar tiempo actual
  2. Agregar Offset a futuro (10 minutos, en su ejemplo)
  3. Reste la medianoche del 1 Ene 1970
  4. Obtener el número total de segundos entre los dos

en C# (de la parte superior de mi cabeza, no probado):

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

¿Cuál es la función que usa para obtener la hora actual?

Claro que toma un parámetro .NET DateTime ...

Sin duda, es sólo una simple cuestión de pasar en un futuro DateTime a la función.

o haciendo una DateDiff en segundos entre la hora actual y la futura y añádala.

var dt = new DateTime(1970, 1, 1, 0, 0, 0).ToUniversalTime(); 

var now = System.DateTime.Now.ToUniversalTime(); 
var future = new DateTime(2010, 1, 1).ToUniversalTime(); 

Console.WriteLine((now - dt).TotalSeconds); 
Console.WriteLine((future - dt).TotalSeconds); 
+0

Esto debe hacerse en el marco de tiempo UTC, pero de lo contrario es correcto. – Noldorin

+0

Saludos, actualizado para mayor claridad –

30

Hay un giro interesante cuando desea conocer el tiempo de la Época Unix en .Net en un sistema Windows.

Para casi todos los casos prácticos y asumiendo la hora actual es más allá de la época Unix que de hecho podría tomar

System.TimeSpan timeDifference = DateTime.UTCNow - 
      new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
long unixEpochTime = System.Convert.ToInt64(timeDifference.TotalSeconds); 

Pero,

Unix Epoch Time se define como" ... un sistema para describir puntos en el tiempo, definidos como la cantidad de segundos transcurridos desde la medianoche Hora Universal Coordinada (UTC) del 1 de enero de 1970, sin contar los segundos intercalares. " (1)

Desde 1972, UTC ha incluido "segundos intercalares", y hemos tenido un total de 25 de ellos hasta ahora. (2)

.Net DateTime no tiene disposiciones para Leap Seconds, pero simplemente se basará en el tiempo del sistema operativo. Windows ignora felizmente Leap Seconds (3) (4), por lo que tendrá la noción de tiempo tal como lo recibe de su maestro NTP (creo que el valor predeterminado para una máquina que no está conectada al dominio es time.windows.com) , que probablemente esté sirviendo UTC, incluidos los segundos intercalares.

Esto significa que para ser pedantemente correcto sobre el número real de segundos transcurridos desde la época de Unix, probablemente debería agregar los segundos intercalares al resultado obtenido anteriormente para las aplicaciones que dependen de esto. Tendría que hacer un seguimiento de la cantidad de segundos para agregar en cada momento, ya que los segundos intercalares no se anuncian con mucha anticipación (2). Sin embargo, como la definición de Unix Epoch Time explícitamente excluye los segundos intercalares, puede ignorar esto de manera segura y simplemente volver a calcular los segundos a partir de la hora UTC actual.

A veces, los segundos interminables causan caos en el software (5). El debate sobre si mantener o eliminar la práctica está en curso (6) (7) (8).

El último segundo salto en el momento de la respuesta se produjo el 1 de julio de 2012 (9) y causó problemas a varios sitios y aplicaciones (10)

(1) http://en.wikipedia.org/wiki/Unix_time

(2) http://en.wikipedia.org/wiki/Leap_second

(3) http://support.microsoft.com/kb/909614

(4) http://www.meinberg.de/english/info/leap-second.htm

(5) http://www.networkworld.com/news/2009/010609-leap-second-snafu-affects-oracle.html

(6) http://www.pcworld.idg.com.au/article/358024/time_waits_no_one_leap_seconds_may_cut/

(7) http://queue.acm.org/detail.cfm?id=1967009

(8) http://arxiv.org/abs/1106.3141

(9) http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat

(10) http://arstechnica.com/business/2012/07/one-day-later-the-leap-second-v-the-internet-scorecard/

(La respuesta original tuvo un error, que afortunadamente atrapado por los comentaristas Edward Brey y Mormegil a continuación)

+1

+1 porque esto es interesante, sin embargo debido a que estoy trabajando en una escala de minutos (más como horas en la mayoría de los casos) y las operaciones no son súper precisas, no creo que pasen 24 segundos ser un gran problema, pero gracias por señalarlo. – UnkwnTech

+3

No creo que esto sea correcto. Ambas suposiciones son correctas (tanto Unix como Windows no cuentan/conocen los segundos intercalares), pero usted toma una conclusión equivocada, en mi humilde opinión. El tiempo de Unix ignora los segundos intercalares, lo que significa que '1973-01-01T00: 00: 00Z' es el tiempo Unix 94694400, es decir' (365 + 366 + 365) * 24 * 60 * 60', aunque transcurrieron dos segundos intercalares mientras tanto. Y exactamente lo mismo es cierto para Windows. Sabe por el maestro NTP que es '1973-01-01T00: 00: 00Z', pero no sabe acerca de dos segundos intercalares.El tiempo de Unix y Windows no es una escala de tiempo continua, pero están sincronizados entre sí. – Mormegil

+0

Es por eso que dije 'pedantemente correcto'. Comparamos con la definición oficial del tiempo Unix Epoch, no en contra de la implementación práctica en un sistema Unix, que como usted señala está en el mismo barco que Windows. –

Cuestiones relacionadas