web-dev-qa-db-fra.com

Comment puis-je convertir un DateTime en nombre de secondes depuis 1970?

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?

109
Slider345

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);
}
179
Dave Swersky

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();
39
codeMonkey

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;
22
CaffGeek

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)); 
14
David

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.

1
supercat

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.

0
Alec Sanger