Comment puis-je convertir un timestamp Unix en DateTime et vice versa ?

Il y a cet exemple de code, mais ensuite il commence à parler de problèmes de millisecondes / nanosecondes.

La même question se trouve sur MSDN, [Seconds since the Unix epoch in C#][1].

Voici ce que j&#8217ai obtenu jusqu&#8217à présent :

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

[1] : http://blogs.msdn.com/brada/archive/2004/03/20/93332.aspx

Solution

Voici ce dont vous avez besoin :

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, pour Java (ce qui est différent car l'horodatage est en millisecondes, pas en secondes) :

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

J'ai trouvé la bonne réponse en comparant simplement la conversion au 1/1/1970 sans l'ajustement de l'heure locale ;

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

Un tick Unix est de 1 seconde (si je me souviens bien), et un tick .NET est de 100 nanosecondes.

Si vous rencontrez des problèmes avec les nanosecondes, vous pouvez essayer d'utiliser AddTick(10000000 * valeur).

Commentaires (1)