2010-10-03 9 views
10

J'ai une fonction qui convertit de temps d'époque unix à une valeur DateTime .NET:Comment puis-je convertir à partir de l'heure unix et compte de l'heure d'été en C#?

public static DateTime FromUnixEpochTime(double unixTime) 
{ 
    DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    return d.AddSeconds(unixTime); 
} 

Où je suis (Royaume-Uni) les horloges aller un heure avant l'heure d'été.

En Python, j'obtiens l'heure locale de l'époque en utilisant time.time() (et pour les besoins de l'argument, en ce moment l'heure est 17:15:00) ce qui me donne une valeur de 1286122500.

Si je le convertis à un temps lisible par l'homme en utilisant time.localtime(), il convertit à 17:15 comme je m'y attendais. Comment puis-je convertir l'heure d'unix en une valeur .NET DateTime ET tenir compte de l'heure d'été locale. Ma fonction ci-dessus convertit 1286122500 en 16:15 ce qui est incorrect pour ma position géographique.

Répondre

20

Utilisation DateTime.ToLocalTime():

http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

public static DateTime FromUnixEpochTime(double unixTime) 
{ 
    DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    d = d.AddSeconds(unixTime); 
    return d.ToLocalTime(); 
} 
+0

+1, rien de plus compliqué n'est nécessaire ici. –

+0

Ah ha ... J'ai essayé 'DateTimeKind.Local' dans le constructeur DateTime, je n'arrive pas à croire que j'ai manqué la méthode' .ToLocalTime() '. – Kev

+0

Vieux mais bon. Merci. – kmarks2

1

Votre heure d'été approche-t-elle? Si c'est le cas, vos fichiers timezone peuvent être périmés, pensant que c'est déjà terminé. (Je ne connais pas le Royaume-Uni, mais aux États-Unis, l'étendue de l'heure avancée a été élargie il y a 3 ans et de nombreuses installations n'ont toujours pas les données mises à jour.)

En bref, assurez-vous que votre fuseau horaire les données sont à jour. :-)

+0

Ils ne sont pas périmés. Python a aussi raison. – Kev

1

Il est 17h15 pour 1286122500 dans le fuseau horaire BST (ou GMT + 1) (heure d'été britannique).

Votre fonction utilise DateTimeKind.Utc qui lui indique d'utiliser UTC (aka GMT), donc vous obtenez un temps en GMT: 16:15. De plus, je ne pense pas que changer le fuseau horaire de la référence de l'époque unix affectera votre fuseau horaire local correctement.

Au lieu de cela, vous pouvez essayer quelque chose comme ceci:

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
DateTime d = unixEpoch + new TimeSpan(unixTime); 

(puis convertir en DateTimeKind.Local)

5

La classe TimeZoneInfo est super à h Elping un accord avec différents temps et fuseaux horaires. Il utilise les informations de fuseau horaire que Windows a intégrées pour convertir entre différents fuseaux horaires.

Voilà comment vous utiliseriez pour votre problème:

//Get your unix epoch time into a DateTime object 
DateTime unixTime = 
    new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc).AddSeconds(1286122500); 

//Convert to local time 
DateTime localTime = TimeZoneInfo.ConvertTime(unixTime, TimeZoneInfo.Local); 

TimeZoneInfo.Local renvoie le TimeZoneInfo qui représente la zone heure locale.