Wie kann ich einen Unix-Zeitstempel in DateTime umwandeln und umgekehrt?

Es gibt diesen Beispielcode, aber dann geht es um Millisekunden-/Nanosekundenprobleme.

Die gleiche Frage ist auf MSDN, Sekunden seit der Unix-Epoche in C#.

Dies ist, was ich bis jetzt habe:

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);
  }
}
Lösung

Hier ist, was Sie brauchen:

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

Oder für Java (was anders ist, weil der Zeitstempel in Millisekunden und nicht in Sekunden angegeben wird):

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;
}
Kommentare (12)

Ich habe die richtige Antwort gefunden, indem ich einfach die Umrechnung zum 1.1.1970 ohne die Anpassung der Ortszeit verglichen habe;

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;
Kommentare (0)

Ein Unix-Tick ist 1 Sekunde (wenn ich mich richtig erinnere), und ein .NET-Tick ist 100 Nanosekunden.

Wenn Sie Probleme mit Nanosekunden haben, sollten Sie vielleicht versuchen, AddTick(10000000 * Wert) zu verwenden.

Kommentare (1)