Kaip konvertuoti "Unix" laiko žymą į "DateTime" ir atvirkščiai?

Yra šis pavyzdinis kodas, tačiau jame pradedama kalbėti apie milisekundžių / nanosekundžių problemas.

Tas pats klausimas yra MSDN, Seconds since the Unix epoch in C#.

Kol kas turiu štai ką:

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

Štai ko jums reikia:

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

Arba Java (tai skiriasi, nes laiko žyma pateikiama milisekundėmis, o ne sekundėmis):

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

Teisingą atsakymą radau tik palyginęs perskaičiavimą su 1970 m. sausio 1 d. be vietos laiko koregavimo;

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

"Unix" erkė yra 1 sekundė (jei gerai pamenu), o .NET erkė yra 100 nanosekundžių.

Jei susidūrėte su problemomis dėl nanosekundžių, galite pabandyti naudoti AddTick(10000000 * value).

Komentarai (1)