Czy .Net DateTime zawiera informacje o strefie czasowej, w której został utworzony?
Mam bibliotekę analizującą DateTime z formatu, który ma na końcu „+ zz” i chociaż analizuje poprawnie i dostosowuje czas lokalny, muszę uzyskać informacje o określonej strefie czasowej z obiektu DateTime.
Czy to w ogóle możliwe? Wszystko, co widzę, to DateTime.Kind, który określa, czy czas jest lokalny, czy UTC.
Odpowiedzi:
Sama DateTime nie zawiera żadnych informacji o prawdziwej strefie czasowej. To może wiedzieć, czy to UTC lub lokalny, ale nie to, co naprawdę znaczy lokalny.
DateTimeOffset jest nieco lepsza - to po prostu czas UTC i przesunięcie. Jednak to wciąż nie wystarczy do określenia strefy czasowej, ponieważ wiele różnych stref czasowych może mieć takie samo przesunięcie w dowolnym momencie. Wygląda na to, że może ci to wystarczyć, ponieważ wszystko, z czym musisz pracować podczas analizowania daty / godziny, to przesunięcie.
Wsparcie dla stref czasowych od .NET 3.5 jest dużo lepsze niż było, ale naprawdę chciałbym zobaczyć standardowy „ZonedDateTime” lub coś w tym rodzaju - czas UTC i aktualną strefę czasową. Łatwo jest zbudować własne, ale byłoby miło zobaczyć to w standardowych bibliotekach.
EDYCJA: Prawie cztery lata później sugerowałbym teraz użycie czasu Noda, który ma raczej bogatszy zestaw typów daty / czasu. Jestem jednak stronniczy, jako główny autor Noda Time :)
źródło
Nie.
Cytat z doskonałego artykułu tutaj . Lektura obowiązkowa dla każdego programisty .Net.
Więc radzę napisać małą klasę opakowaniową, która odpowiada Twoim potrzebom.
źródło
Istnieje publiczna biblioteka TimeZone dla .NET . Naprawdę użyteczne. Odpowiada na Twoje potrzeby.
Rozwiązanie ogólnego problemu strefy czasowej jest trudniejsze niż myślisz.
źródło
Możesz użyć klasy TimeZoneInfo
Klasa TimeZone rozpoznaje lokalną strefę czasową i może konwertować czasy między uniwersalnym czasem koordynowanym (UTC) a czasem lokalnym. Obiekt TimeZoneInfo może reprezentować dowolną strefę czasową, a metody klasy TimeZoneInfo mogą służyć do konwertowania czasu w jednej strefie czasowej na odpowiedni czas w dowolnej innej strefie czasowej. Elementy członkowskie klasy TimeZoneInfo obsługują następujące operacje:
Pobieranie strefy czasowej, która jest już zdefiniowana przez system operacyjny.
Wyliczenie stref czasowych, które są dostępne w systemie.
Przeliczanie czasów pomiędzy różnymi strefami czasowymi.
Tworzenie nowej strefy czasowej, która nie została jeszcze zdefiniowana przez system operacyjny.
Serializowanie strefy czasowej do późniejszego pobrania.
źródło
Z interfejsu API ( http://msdn.microsoft.com/en-us/library/system.datetime_members(VS.71).aspx ) wygląda na to, że nie można wyświetlić nazwy używanej strefy czasowej.
źródło
Ogólnie praktyką byłoby przekazywanie danych jako DateTime z „strefą czasową” UTC, a następnie przekazywanie obiektu TimeZoneInfo, a gdy jesteś gotowy do wyświetlenia danych, możesz użyć obiektu TimeZoneInfo do przekonwertowania UTC DateTime.
Inną opcją jest ustawienie DateTime z bieżącą strefą czasową, a następnie upewnij się, że „strefa czasowa” jest nieznana dla obiektu DateTime, a następnie upewnij się, że DateTime jest ponownie przekazywana z TimeZoneInfo, która wskazuje TimeZone z DateTime.
Jak wskazywali inni, byłoby miło, gdyby Microsoft do tego doszedł i stworzył jeden fajny obiekt, aby zrobić to wszystko, ale na razie musisz poradzić sobie z dwoma obiektami.
źródło
DateTime nie zna swojego przesunięcia w strefie czasowej. Nie ma wbudowanej metody zwracania przesunięcia lub nazwy strefy czasowej (np. EAT, CEST, EST itp.).
Jak sugerowali inni, możesz przekonwertować swoją datę na UTC:
a potem tylko oblicz różnicę:
Możesz również przekonwertować jeden raz na inny za pomocą DateTimeOffset:
Ale jest to rodzaj stratnej kompresji - samo przesunięcie nie może powiedzieć, która to strefa czasowa, ponieważ dwa różne kraje mogą znajdować się w różnych strefach czasowych i mieć ten sam czas tylko przez część roku (np. RPA i Europa). Należy również pamiętać, że letni czas letni może zostać wprowadzony w różnych terminach (EST vs CET - różnica 3 tygodni).
Nazwę lokalnej strefy czasowej systemu można uzyskać za pomocą klasy TimeZoneInfo:
Zgadzam się z Gerrie Schenck, przeczytaj artykuł, który zasugerował.
źródło