Nie jestem pewien, co mogę dodać do powyższych odpowiedzi, ale oto kilka punktów ode mnie:
Rodzaje czasów
Należy wziąć pod uwagę cztery różne czasy:
- Czas wydarzenia: np. Czas, kiedy ma miejsce międzynarodowa impreza sportowa lub koronacja / śmierć / itp. Zależy to od strefy czasowej wydarzenia, a nie od widza.
- Czas telewizyjny: np. Określony program telewizyjny jest emitowany o 21:00 czasu lokalnego na całym świecie. Ważne, gdy myślisz o opublikowaniu wyników (np. American Idol) na swojej stronie internetowej
- Czas względny: np .: To pytanie ma otwarte zamknięcie nagrody w ciągu 21 godzin. Jest to łatwe do wyświetlenia
- Powtarzający się czas: np .: program telewizyjny jest w każdy poniedziałek o 21:00, nawet jeśli zmienia się czas letni.
Jest też czas historyczny / alternatywny. Są denerwujące, ponieważ mogą nie odwzorować czasu standardowego. Np .: daty juliańskie, daty według kalendarza księżycowego na Saturnie, kalendarz Klingona.
Przechowywanie znaczników czasu rozpoczęcia / zakończenia w UTC działa dobrze. Dla 1 potrzebujesz nazwy strefy czasowej zdarzenia + przesunięcia zapisanej wraz ze zdarzeniem. W przypadku 2 potrzebujesz lokalnego identyfikatora czasu zapisanego dla każdego regionu oraz lokalnej nazwy strefy czasowej + przesunięcia zapisanego dla każdej przeglądarki (możesz uzyskać to z adresu IP, jeśli jesteś w kryzysie). Dla 3, przechowuj w UTC sekundach i nie potrzebujesz stref czasowych. 4 to szczególny przypadek 1 lub 2, w zależności od tego, czy jest to wydarzenie globalne, czy lokalne, ale musisz także zapisać utworzony znacznik czasu, aby można było stwierdzić, czy definicja strefy czasowej uległa zmianie przed utworzeniem tego zdarzenia, czy po nim. Jest to konieczne, jeśli chcesz pokazać dane historyczne.
Czas przechowywania
- Zawsze przechowuj czas w UTC
- Konwertuj na wyświetlany czas lokalny (lokalny jest definiowany przez użytkownika patrząc na dane)
- Podczas przechowywania strefy czasowej potrzebujesz nazwy, znacznika czasu i przesunięcia. Jest to wymagane, ponieważ rządy czasami zmieniają znaczenie swoich stref czasowych (np. Rząd USA zmienił daty DST), a twoja aplikacja musi z wdziękiem sobie z tym poradzić ... np .: Dokładny znacznik czasu, w którym odcinki LOST były wyświetlane zarówno przed, jak i po regułach DST zmienione.
Przesunięcia i nazwy
Przykładem powyższego byłoby:
Mecz finałów mistrzostw świata w piłce nożnej odbył się w Afryce Południowej (UTC + 2 - SAST) w dniu 11 lipca 2010 r. O godzinie 19:00 UTC.
Dzięki tym informacjom możemy historycznie określić dokładny czas, w którym miały miejsce finały WCS 2010, nawet jeśli zmieni się definicja strefy czasowej w RPA, i będziemy w stanie wyświetlić ją widzom w ich lokalnej strefie czasowej w momencie, gdy przeszukują bazę danych.
Czas systemu
Musisz także zsynchronizować pliki tzdata systemu operacyjnego, bazy danych i aplikacji, zarówno ze sobą, jak i z resztą świata, i przeprowadzić intensywne testy podczas aktualizacji. Nie jest niczym niezwykłym, że aplikacja innej firmy, na której polegasz, nie obsługiwała poprawnie zmiany TZ.
Upewnij się, że zegary sprzętowe są ustawione na UTC, a jeśli korzystasz z serwerów na całym świecie, upewnij się, że ich systemy operacyjne są skonfigurowane do korzystania z UTC. Staje się to widoczne, gdy trzeba kopiować co godzinę obrócone pliki dziennika apache z serwerów w wielu strefach czasowych. Sortowanie ich według nazwy pliku działa tylko wtedy, gdy wszystkie pliki mają taką samą strefę czasową. Oznacza to również, że nie musisz wykonywać obliczeń matematycznych w swojej głowie, gdy ssh z jednego pola do drugiego i musisz porównać znaczniki czasu.
Ponadto uruchom ntpd na wszystkich polach.
Klienci
Nigdy nie ufaj znacznikowi czasu, który otrzymujesz z komputera klienckiego jako prawidłowy. Na przykład nagłówki Date: HTTP lub Date.getTime()
wywołanie javascript . Są one odpowiednie, gdy są używane jako nieprzezroczyste identyfikatory lub podczas obliczania matematycznego podczas jednej sesji na tym samym kliencie, ale nie próbuj odwoływać się do tych wartości z czymś, co masz na serwerze. Twoi klienci nie korzystają z NTP i niekoniecznie mają działającą baterię dla zegara BIOS.
Drobnostki
Wreszcie rządy czasami robią bardzo dziwne rzeczy:
Standardowy czas w Holandii wynosił dokładnie 19 minut i 32,13 sekundy przed UTC zgodnie z prawem od 1909-05-01 do 1937-06-30. Tej strefy czasowej nie można dokładnie przedstawić przy użyciu formatu GG: MM.
Ok, chyba skończone.
GETDATE()
na SQL będzie UTC (jak będzieDateTime.Now
). Serwer nie będzie miał wpływu na żadne automatyczne zmiany czasu letniego.