Como posso converter um timestamp Unix para DateTime e vice versa?

Existe este código de exemplo, mas depois começa a falar de problemas de milissegundos / nanossegundos.

A mesma questão está no MSDN, Segundos desde a época Unix em C#.

Isto é o que a I'tenho até agora:

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);
  }
}
Solução

Aqui'é o que você precisa:

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

Ou, para Java (que é diferente porque o carimbo da hora é em milissegundos, não em 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;
}
Comentários (12)

Encontrei a resposta certa apenas comparando a conversão a 1/1/1970 sem o ajuste da 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;
Comentários (0)

Um tick Unix é 1 segundo (se bem me lembro), e um tick .NET é 100 nanossegundos.

Se você'tem encontrado problemas com nanossegundos, você pode querer tentar usar AddTick(10000000 * valor).

Comentários (1)