Zwykle mam "przechwytywacz", który tuż przed odczytem / zapisem z / do bazy danych dokonuje konwersji DateTime (z UTC na czas lokalny iz czasu lokalnego na UTC), więc mogę używać DateTime.Now
(derywacji i porównań) w całym systemie bez obaw o strefach czasowych.
Jeśli chodzi o serializację i przenoszenie danych między komputerami, nie trzeba się tym przejmować, ponieważ data i godzina to zawsze UTC.
Czy powinienem nadal przechowywać moje daty (SQL 2008 - datetime) w formacie UTC, czy zamiast tego powinienem przechowywać je przy użyciu DateTimeOffset
(SQL 2008 - datetimeoffset)?
Daty UTC w bazie danych (typ datetime) działają i są znane od tak dawna, po co to zmieniać? Jakie są zalety?
Przeglądałem już artykuły takie jak ten , ale nie jestem w 100% przekonany. jakieś pomysły?
źródło
Odpowiedzi:
Jest jedna ogromna różnica, w której nie można używać samego UTC.
Jeśli masz taki scenariusz
Następnie:
Ale:
Prostym przykładem jest system rezerwacji biletów lotniczych ... Bilet lotniczy powinien zawierać 2 godziny: - czas „startu” (w strefie czasowej miasta „From”) - czas „lądowania” (w strefie czasowej miasta „Destination”)
źródło
InputLocationId
(lub podobnej znormalizowanej jednostki). Wymagałoby to obliczeń (cześć, wyjątki ... szczególnie ty, Indiana ), ale nadal jest to proces deterministyczny - a wtedy równowaga logiki daty i godziny aplikacji jest prosta.Masz absolutną rację, używając UTC dla wszystkich czasów historycznych (tj. Nagrywanie wydarzeń). Zawsze można przejść z UTC do czasu lokalnego, ale nie zawsze na odwrót.
Kiedy używać czasu lokalnego? Odpowiedz na to pytanie:
Przechowuj czas lokalny tylko wtedy, gdy odpowiedź brzmi „tak”. Oczywiście będzie to dotyczyło tylko przyszłych dat i zwykle tylko dat, które mają jakiś wpływ na ludzi.
Po co przechowywać strefę czasową / przesunięcie?
Po pierwsze, jeśli chcesz zarejestrować przesunięcie dla użytkownika, który wykonał akcję, prawdopodobnie najlepiej będzie to zrobić, tj. Podczas logowania zapisz lokalizację i strefę czasową tego użytkownika.
Po drugie, jeśli chcesz przekonwertować do wyświetlania, musisz mieć tabelę wszystkich lokalnych przejść przesunięcia czasu dla tej strefy czasowej, po prostu wiedząc, że bieżące przesunięcie nie wystarczy, ponieważ jeśli pokazujesz datę / godzinę sprzed sześciu miesięcy, przesunięcie będzie być innym.
źródło
DATETIMEOFFSET daje możliwość przechowywania czasu lokalnego i czasu UTC w jednym polu.
Pozwala to na bardzo proste i wydajne raportowanie w czasie lokalnym lub UTC bez konieczności przetwarzania danych do wyświetlania w jakikolwiek sposób.
Są to dwa najczęstsze wymagania - czas lokalny dla raportów lokalnych i czas UTC dla raportów grupowych.
Czas lokalny jest przechowywany w części DATETIME w DATETIMEOFFSET, a OFFSET z UTC jest przechowywany w części OFFSET, dzięki czemu konwersja jest prosta, a ponieważ nie wymaga znajomości strefy czasowej, z której pochodzą dane, można to zrobić na poziomie bazy danych .
Jeśli nie potrzebujesz czasu do milisekund, np. Tylko do minut lub sekund, możesz użyć DATETIMEOFFSET (0). Pole DATETIMEOFFSET będzie wtedy wymagało tylko 8 bajtów pamięci - tyle samo, co DATETIME.
Stosowanie DATETIMEOFFSET zamiast UTC DATETIME zapewnia zatem większą elastyczność, wydajność i prostotę raportowania.
źródło