Hvordan kan jeg konvertere et Unix-tidsstempel til DateTime og omvendt?

Det er denne eksempelkoden, men så begynner den å snakke om millisekund / nanosekundproblemer.

Det samme spørsmålet er på MSDN, Sekunder siden Unix-epoken i C#.

Dette er hva jeg har så langt:

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øsning

Her er det du trenger:

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

Eller, for Java (som er annerledes fordi tidsstempelet er i millisekunder, ikke sekunder):

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

Jeg fant det riktige svaret bare ved å sammenligne omregningen til 1/1/1970 uten lokal tidsjustering;

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

Et Unix-tick er 1 sekund (hvis jeg husker riktig), og et .NET-tick er 100 nanosekunder.

Hvis du har hatt problemer med nanosekunder, kan du prøve å bruke AddTick(10000000 * verdi).

Kommentarer (1)