2010-10-03 23 views
10

Mam funkcję, która przekształca od czasu epoki Uniksa do wartości .NET DateTime:Jak przekonwertować czas i czas unixu na czas letni w C#?

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

Gdzie jestem (UK) zegary pójść na czas letni jedna godzina do przodu.

W języku Python uzyskuję lokalny czas Epoki, używając time.time() (i ze względu na argument, teraz jest 17:15:00), co daje mi wartość 1286122500.

Jeśli skonwertuję ten tekst z powrotem na czas czytelny dla człowieka za pomocą time.localtime(), to zostanie on przekonwertowany z powrotem na 17:15, jak można się spodziewać.

Jak przekonwertować czas epoki unix z powrotem na wartość .NET DateTime Wartość I konto dla lokalnego czasu letniego. Powyższa funkcja powoduje konwersję 1286122500 z powrotem na 16:15, co jest nieprawidłowe w mojej lokalizacji geograficznej.

Odpowiedz

20

Zastosowanie 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, tutaj nie potrzeba niczego bardziej skomplikowanego. –

+0

Ah ha ... Próbowałem 'DateTimeKind.Local' w konstruktorze DateTime, nie mogę uwierzyć, że przegapiłem metodę' .ToLocalTime() '. – Kev

+0

Stary, ale dobry. Dzięki. – kmarks2

1

Czy zbliża się koniec okresu letniego? Jeśli tak, pliki stref czasowych mogą być nieaktualne, co oznacza, że ​​zostały już zakończone. (Nie wiem o Wielkiej Brytanii, ale w USA zakres oszczędności w okresie letnim został rozszerzony 3 lata temu, a wiele instalacji wciąż nie ma zaktualizowanych danych.)

Krótko mówiąc, upewnij się, że strefa czasowa dane są aktualne. :-)

+0

Nie są przestarzałe. Również Python ma to prawo. – Kev

1

To 17:15 dla 1286122500 w strefie czasowej BST (lub GMT + 1) (brytyjski czas letni).

Twoja funkcja używa DateTimeKind.Utc, która mówi, żeby użyć UTC (inaczej GMT), więc otrzymasz czas w GMT: 16:15. Ponadto, nie sądzę, aby zmiana strefy czasowej odniesienia do epoki unixu wymagała poprawnego działania w aktualnej lokalnej strefie czasowej.

Zamiast tego, można spróbować czegoś takiego:

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

(a następnie przekonwertować do DateTimeKind.Local)

5

Klasa TimeZoneInfo jest świetnie w h załatwienie jednej transakcji z różnymi czasami i strefami czasowymi. Używa informacji o strefie czasowej, którą system Windows wbudował, aby konwertować między różnymi strefami czasowymi.

Oto jak chcesz go używać do problemu:

//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 zwraca TimeZoneInfo reprezentujący lokalną strefę czasową.

Powiązane problemy