На жаль, для цього немає швидкого виправлення. Інтернаціоналізація програми повинна бути частиною перших обговорень дизайну, оскільки вона дійсно лежить в основі багатьох різних областей, включаючи порівняння дати та часу та форматування вихідних даних.
У будь-якому разі, щоб стати на шлях правильного виконання, важливо зберігати інформацію про часовий пояс із часом . Іншими словами, розуміючи, що дата / час 20130407 14:50
є безглуздим без (a) включення зсуву часового поясу часового поясу UTC (примітка 1) , або (b) забезпечення того, що вся логіка, що вставляє ці значення, спочатку перетворюється на певний фіксований зміщення ( швидше за все 0). Без жодної з цих речей два задані значення часу є незрівнянними , а дані пошкоджені . (Останній метод , до речі, грає з вогнем (примітка 2) ; не робіть цього.)
У SQL Server 2008+ ви можете зберігати зсув із часом безпосередньо, використовуючи datetimeoffset
тип даних. (Для повноти, у 2005 році і раніше я додав би другий стовпець, щоб зберігати поточне значення зміщення UTC (у хвилинах).)
Це полегшує додаток для настільного типу, оскільки ці платформи зазвичай мають механізми автоматичного перетворення дати / часу + часовий пояс у місцевий час, а потім форматування для виведення даних, все залежно від регіональних налаштувань користувача.
Для Інтернету, який є суттєво відключеною архітектурою, навіть при встановленні резервних даних належним чином, це складніше, оскільки вам потрібна інформація про клієнта, щоб мати змогу здійснити перетворення та / або форматування. Зазвичай це робиться за допомогою налаштувань уподобань користувачів (програма перетворює / форматує речі перед виведенням) або просто показує речі з однаковим фіксованим форматом і зміщенням часового поясу для всіх (що це робить платформа Stack Exchange в даний час).
Ви можете бачити, як якщо дані бек-енду не налаштовані належним чином, дуже швидко вони стануть складними і хиткими. Я б не рекомендував спускатися жодним із цих шляхів, тому що у вас просто виникне більше проблем.
Примітка 1:
Зсув UTC за часовим поясом не фіксований: врахуйте економію літнього часу, коли зміщення UTC зони в залежності від значення плюс-мінус на годину. Крім того, дати літнього часу в зонах змінюються регулярно. Таким чином, використання datetimeoffset
(або композиція local time
та UTC offset at that time
) призводить до максимального відновлення інформації.
Примітка 2:
Йдеться про введення даних. Хоча не існує надійного способу перевірки вхідних значень, краще застосувати простий стандарт, який не передбачає обчислень. Якщо публічний API очікує типу даних, який включає зміщення, ця вимога буде зрозумілою для абонента.
Якщо це не було так, абонент повинен покладатися на документацію (якщо вони її читають), або обчислення зроблено неправильно, і т. Д. Існує менше режимів відмов / помилок, коли вимагається зміщення, зокрема для розподіленої системи ( або навіть просто веб / база даних на окремих серверах, як це буває тут).
Зберігання компенсації все одно вбиває двох птахів одним каменем; і навіть якщо це не потрібно в даний час , це робить можливість доступна пізніше , якщо це необхідно. Правда, це займає більше місця для зберігання даних, але я вважаю, що це варто компромісу, оскільки дані втрачаються, якщо вони ніколи не записуються.