¿Cómo puedo convertir una marca de tiempo Unix en DateTime y viceversa?

Hay este código de ejemplo, pero luego empieza a hablar de problemas de milisegundos / nanosegundos.

La misma pregunta está en MSDN, Segundos desde la época de Unix en C#.

Esto es lo que tengo hasta ahora:

public Double CreatedEpoch
{
  get
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    TimeSpan span = (this.Created.ToLocalTime() - epoch);
    return span.TotalSeconds;
  }
  set
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    this.Created = epoch.AddSeconds(value);
  }
}
Solución

Esto es lo que necesita:

public static DateTime UnixTimeStampToDateTime( double unixTimeStamp )
{
    // Unix timestamp is seconds past epoch
    System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
    dtDateTime = dtDateTime.AddSeconds( unixTimeStamp ).ToLocalTime();
    return dtDateTime;
}

O, para Java (que es diferente porque la marca de tiempo está en milisegundos, no en segundos):

public static DateTime JavaTimeStampToDateTime( double javaTimeStamp )
{
    // Java timestamp is milliseconds past epoch
    System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
    dtDateTime = dtDateTime.AddMilliseconds( javaTimeStamp ).ToLocalTime();
    return dtDateTime;
}
Comentarios (12)

Encontré la respuesta correcta simplemente comparando la conversión al 1/1/1970 sin el ajuste de la hora local;

DateTime date = new DateTime(2011, 4, 1, 12, 0, 0, 0);
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan span = (date - epoch);
double unixTime =span.TotalSeconds;
Comentarios (0)

Un tick de Unix es 1 segundo (si recuerdo bien), y un tick de .NET es 100 nanosegundos.

Si tiene problemas con los nanosegundos, puede intentar usar AddTick(10000000 * valor).

Comentarios (1)