Я не впевнений, що можу додати до вищезазначених відповідей, але ось кілька моментів від мене:
Типи разів
Ви повинні врахувати чотири рази:
- Час події: наприклад, час, коли відбувається міжнародна спортивна подія, або коронація / смерть тощо. Це залежить від часового поясу події, а не від глядача.
- Час телебачення: наприклад, конкретне телешоу транслюється о 21:00 за місцевим часом у всьому світі. Важливо, коли розмірковуєте над публікацією результатів (скажімо, American Idol) на своєму веб-сайті
- Відносний час: наприклад: Це запитання закривається за 21 год. Це легко відобразити
- Повторний час: наприклад: Телевізійне шоу відбувається щопонеділка о 21:00, навіть коли DST змінюється.
Також є історичний / альтернативний час. Вони дратують, оскільки вони не можуть повернутися до стандартного часу. Напр.: Джуліанські дати, дати згідно місячного календаря на Сатурні, Клінгонський календар.
Зберігання часових позначок початку та кінця в UTC працює добре. Для 1 вам потрібна назва часового поясу події + зміщення, збережене разом із подією. Для 2 вам потрібен локальний ідентифікатор часу, що зберігається з кожною областю, і місцеве ім'я часового поясу + зміщення, збережене для кожного глядача (це можливо отримати з IP-адреси, якщо ви стиснулися). Протягом 3 годин зберігайте в UTC секундах і не потрібно часу. 4 - це особливий випадок 1 або 2 залежно від того, глобальна це чи локальна подія, але вам також потрібно зберегти створене в часовій марці, щоб ви могли визначити, чи змінилося визначення часового поясу до або після створення цієї події. Це необхідно, якщо потрібно показати історичні дані.
Зберігання разів
- Завжди зберігайте час у UTC
- Перетворити на місцевий час на дисплеї (місцевий визначається користувачем, який переглядає дані)
- Під час зберігання часового поясу потрібні ім’я, часова марка та зміщення. Це потрібно, тому що уряди іноді змінюють значення своїх часових поясів (наприклад: уряд США змінив дати DST), і ваш додаток повинен грамотно поводитись із речами ... Наприклад: точна мітка часу, коли епізоди LOST відображалися як до, так і після правил DST змінився.
Зсуви та імена
Прикладом вищезазначеного може бути:
Гра в фіналі чемпіонату світу з футболу відбулася в Південній Африці (UTC + 2 - SAST) 11 липня 2010 року о 19:00 UTC.
За допомогою цієї інформації ми можемо історично визначити точний час, коли відбувся фінал WCS 2010 року, навіть якщо визначення південноафриканського часового поясу змінилося, і зможемо відобразити це глядачам у своєму локальному часовому поясі на момент запиту бази даних.
Системний час
Вам також потрібно тримати файли ОС, бази даних та додатків tzdata синхронізовано, як між собою, так і з рештою світу, і під час оновлення проводити велику перевірку. Це не є нечуваним, що стороннє додаток, від якого ви залежите, не впорався із зміною TZ правильно.
Переконайтеся, що апаратні годинники встановлені на UTC, а якщо ви працюєте з серверами по всьому світу, переконайтеся, що їх ОС налаштовані також для використання UTC. Це стає очевидним, коли вам потрібно копіювати щоденно обертові файли журналу apache з серверів у декілька часових поясів. Сортування їх за назвою файлів працює лише в тому випадку, якщо всі файли названі з однаковим часовим поясом. Це також означає, що вам не потрібно робити математику дат у голові, коли ви переходите з одного поля в інше і вам потрібно порівнювати часові позначки.
Також запустіть ntpd у всіх полях.
Клієнти
Ніколи не довіряйте часовій позначці, отриманій від клієнтської машини, як дійсній. Наприклад, заголовки Date: HTTP або Date.getTime()
дзвінок javascript . Це добре, якщо вони використовуються як непрозорі ідентифікатори або коли ви робите математику дат під час одного сеансу на тому ж клієнті, але не намагайтеся перехресне посилання на ці значення із тим, що у вас є на сервері. Ваші клієнти не запускають NTP і, можливо, не обов'язково мають батарею, що працює для BIOS-годин.
Дрібниці
Нарешті, уряди іноді роблять дуже дивні речі:
Стандартний час у Нідерландах за законом з 1909-05-01 по 1937-06-30 був рівним на 19 хвилин і на 32,13 секунди попереду UTC. Цей часовий пояс не може бути точно представлений у форматі HH: MM.
Гаразд, я думаю, що я закінчив.
GETDATE()
на SQL буде UTC (як будеDateTime.Now
). І сервер не матиме ніяких автоматичних змін DST.