Próbuję utworzyć test jednostkowy, aby przetestować przypadek, gdy strefa czasowa zmienia się na komputerze, ponieważ została nieprawidłowo ustawiona, a następnie poprawiona.
W teście muszę mieć możliwość tworzenia obiektów DateTime w żadnej lokalnej strefie czasowej, aby upewnić się, że osoby uruchamiające test mogą to zrobić pomyślnie, niezależnie od tego, gdzie się znajdują.
Z tego, co widzę z konstruktora DateTime, mogę ustawić TimeZone jako lokalną strefę czasową, strefę czasową UTC lub nieokreśloną.
Jak utworzyć DateTime z określoną strefą czasową, taką jak PST?
Odpowiedzi:
Odpowiedź Jona mówi o TimeZone , ale zamiast tego sugerowałbym użycie TimeZoneInfo .
Osobiście lubię przechowywać rzeczy w UTC tam, gdzie to możliwe (przynajmniej w przeszłości; przechowywanie UTC na przyszłość wiąże się z potencjalnymi problemami ), więc proponuję taką strukturę:
Możesz chcieć zmienić nazwy „TimeZone” na „TimeZoneInfo”, aby wszystko było jaśniejsze - sam wolę krótsze nazwy.
źródło
Struktura DateTimeOffset została stworzona właśnie z myślą o takich zastosowaniach.
Zobacz: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
Oto przykład tworzenia obiektu DateTimeOffset z określoną strefą czasową:
DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));
źródło
Pozostałe odpowiedzi są przydatne, ale nie obejmują konkretnego sposobu uzyskania dostępu do Pacific - proszę bardzo:
Co dziwne, chociaż „Pacific Standard Time” zwykle oznacza coś innego niż „Pacific Daylight Time”, w tym przypadku odnosi się ogólnie do czasu pacyficznego. W rzeczywistości, jeśli użyjesz go
FindSystemTimeZoneById
do pobrania, jedną z dostępnych właściwości jest wartość bool informująca, czy w tej strefie czasowej jest obecnie czas letni, czy nie.Możesz zobaczyć bardziej uogólnione przykłady tego w bibliotece, którą ostatecznie zebrałem, aby poradzić sobie z datami, których potrzebuję w różnych strefach czasowych, w zależności od tego, skąd użytkownik pyta, itp.:
https://github.com/b9chris/TimeZoneInfoLib.Net
To nie zadziała poza systemem Windows (na przykład Mono w systemie Linux), ponieważ lista czasów pochodzi z rejestru systemu Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
Poniżej znajdziesz klucze (ikony folderów w Edytorze rejestru); nazwy tych kluczy są tym, do których przekazujesz
FindSystemTimeZoneById
. W systemie Linux musisz użyć oddzielnego zestawu definicji stref czasowych w standardzie Linux, którego nie zbadałem odpowiednio.źródło
I zmienił Jon Skeet odpowiedzieć trochę w internecie metodą wydłużania. Działa również na lazurze jak urok.
źródło
Będziesz musiał utworzyć do tego niestandardowy obiekt. Twój obiekt niestandardowy będzie zawierał dwie wartości:
Nie jestem pewien, czy istnieje już typ danych dostarczony przez CLR, który to ma, ale przynajmniej składnik TimeZone jest już dostępny.
źródło
Podoba mi się odpowiedź Jona Skeeta, ale chciałbym dodać jedną rzecz. Nie jestem pewien, czy Jon spodziewał się, że ktor zawsze będzie przekazywany w lokalnej strefie czasowej. Ale chcę go używać w przypadkach, gdy jest to coś innego niż lokalny.
Odczytuję wartości z bazy danych i wiem, w jakiej strefie czasowej znajduje się ta baza danych. W programie ctor przekażę strefę czasową bazy danych. Ale chciałbym mieć wartość w czasie lokalnym. Jon's LocalTime nie zwraca oryginalnej daty przekonwertowanej na datę lokalnej strefy czasowej. Zwraca datę przekonwertowaną na oryginalną strefę czasową (cokolwiek przeszedłeś do ctora).
Myślę, że te nazwy nieruchomości wyjaśniają to ...
źródło
Korzystanie z klasy TimeZones ułatwia tworzenie określonej daty dla strefy czasowej.
źródło