Niestety nie można tego szybko naprawić. Internacjonalizacja aplikacji powinna być częścią pierwszych dyskusji projektowych, ponieważ tak naprawdę dotyczy ona wielu różnych obszarów, w tym porównań daty i godziny oraz formatowania danych wyjściowych.
W każdym razie, aby przejść na ścieżkę Doing It Right, należy przechowywać informacje o strefie czasowej wraz z czasem . Innymi słowy, uświadomienie sobie, że data / czas nie20130407 14:50
ma znaczenia bez (a) uwzględnienia aktualnego wówczas przesunięcia UTC strefy czasowej (uwaga 1) lub (b) upewnienia się, że cała logika wstawiająca te wartości najpierw przekształca się w pewne ustalone przesunięcie ( najprawdopodobniej 0). Bez tych dwóch wartości dwie podane wartości czasu są nieporównywalne , a dane są uszkodzone . (Nawiasem mówiąc, ta druga metoda polega na graniu ogniem (uwaga 2) ; nie rób tego.)
W SQL Server 2008+ można przechowywać przesunięcie z czasem bezpośrednio, używając datetimeoffset
typu danych. (Dla kompletności, w 2005 r. I wcześniej dodałbym drugą kolumnę do przechowywania aktualnej wówczas wartości przesunięcia UTC (w minutach).)
Ułatwia to aplikację typu desktop, ponieważ platformy te zwykle mają mechanizmy do automatycznego konwertowania daty / godziny + strefy czasowej na czas lokalny, a następnie formatowania danych wyjściowych, wszystko na podstawie ustawień regionalnych użytkownika.
W przypadku sieci, która jest z natury odłączoną architekturą, nawet przy prawidłowo skonfigurowanych danych zaplecza, jest bardziej złożona, ponieważ potrzebujesz informacji o kliencie, aby móc przeprowadzić konwersję i / lub formatowanie. Zwykle odbywa się to za pomocą ustawień preferencji użytkownika (aplikacja konwertuje / formatuje rzeczy przed wyjściem) lub po prostu pokazuje rzeczy z tym samym stałym formatem i przesunięciem strefy czasowej dla wszystkich (co obecnie robi platforma Stack Exchange).
Możesz zobaczyć, jak jeśli dane zaplecza nie zostaną poprawnie skonfigurowane, bardzo szybko stanie się skomplikowane i zhackowane. Nie polecałbym zejść żadną z tych ścieżek, ponieważ po prostu skończy się więcej problemów.
Notatka 1:
Przesunięcie UTC strefy czasowej nie jest stałe: rozważ oszczędności w świetle dziennym, gdy przesunięcie UTC strefy różni się o plus lub minus godzinę. Również daty i godziny letni w strefach różnią się regularnie. Zatem użycie datetimeoffset
(lub połączenie local time
i UTC offset at that time
) zapewnia maksymalne odzyskiwanie informacji.
Uwaga 2:
Chodzi o kontrolowanie danych wejściowych. Chociaż nie ma niezawodnego sposobu sprawdzania poprawności wartości przychodzących, lepiej jest wprowadzić prosty standard, który nie wymaga obliczeń. Jeśli publiczny interfejs API oczekuje typu danych zawierającego przesunięcie, wymaganie to będzie jasne dla osoby dzwoniącej.
Jeśli tak nie było, osoba dzwoniąca musi polegać na dokumentacji (jeśli ją czyta) lub obliczenia są wykonywane niepoprawnie itp. Istnieje mniej trybów awarii / błędów wymagających przesunięcia, w szczególności w przypadku systemu rozproszonego ( lub nawet po prostu sieć / baza danych na oddzielnych serwerach, jak w tym przypadku).
Przechowywanie przesunięcia i tak zabija dwa ptaki jednym kamieniem; i nawet jeśli nie jest to teraz wymagane , umożliwia to później, jeśli to konieczne. To prawda, że zajmuje więcej miejsca, ale myślę, że warto go wymienić, ponieważ dane zostaną utracone, jeśli nigdy nie zostaną zapisane.