J'essaie de convertir une variable DateTime C # en temps Unix, c'est-à-dire le nombre de secondes depuis le 1er janvier 1970. Il semble qu'un DateTime est réellement implémenté sous la forme du nombre de 'ticks' depuis le 1er janvier 0001.
Ma pensée actuelle est de soustraire le 1er janvier 1970 à mon DateTime comme ceci:
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
Y a-t-il un meilleur moyen?
C'est fondamentalement ça. Voici les méthodes que j'utilise pour convertir vers et depuis Unix Epoch time:
public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
DateTime Origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
return Origin.AddSeconds(timestamp);
}
public static double ConvertToUnixTimestamp(DateTime date)
{
DateTime Origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
TimeSpan diff = date.ToUniversalTime() - Origin;
return Math.Floor(diff.TotalSeconds);
}
Si le reste de votre système fonctionne correctement avec DateTimeOffset au lieu de DateTime, il existe une fonctionnalité très pratique:
long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();
La seule chose que je vois, c’est que c’est censé être depuis minuit le 1er janvier 1970 UTC
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;
Vous voudrez probablement utiliser DateTime.UtcNow pour éviter un problème de fuseau horaire
TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0));
Cette approche sera bonne si la date-heure en question est en UTC ou représente l'heure locale dans une zone qui n'a jamais observé l'heure d'été. Les routines de différence de date et d'heure ne tiennent pas compte de l'heure d'été et considèrent par conséquent minuit le 1er juin comme étant un multiple de 24 heures après minuit le 1er janvier. Je ne suis au courant d'aucun élément de Windows présentant des règles historiques d'économie de l'heure avancée pour le système actuel. Je ne pense donc pas qu’il existe un bon moyen de gérer correctement un moment quelconque avant le dernier changement de règle d’heure avancée.
Vous pouvez créer un startTime et un endTime de DateTime, puis effectuer endTime.Subtract (startTime). Puis sortez votre span.Seconds.
Je pense que cela devrait fonctionner.