Формати дати

Питання

Як підготувати мої веб-сторінки для відображення різних міжнародних форматів дати?

Відвідувачів веб-сайту з різних місць можуть заплутати формати дати. Формат MM/DD/YY (місяць/день/рік) є унікальним для Сполучених Штатів Америки. Майже вся Європа використовує формат DD/MM/YY (день/місяць/рік). Японія використовує формат YY/MM/DD (рік/місяць/день). Розділювачами можуть бути: слеш, тире або періоди. В деяких місцях нулі, що ставляться попереду друкують, а в деяких їх упускають. Якщо японськомовний користувач на Німецькому веб сайті читає веб сторінку, що написана на Англійській мові (якою розмовляють американці US), і ця сторінка містить дату 03/04/02, то як вони будуть трактувати цю дату?

Відповідь

Ваш перший кроком може бути слідуючим: припустити що, ця проблема буде вирішена під час локалізації веб сторінок - тобто нехай перекладач це виправить. Не робіть цього. Ви дійсно хочете зберігати окремі копії документів для США і Великобританії, які відрізняються тільки форматом дати? У будь-якому випадку вам все одно доведеться мати справу з багатомовним користувачам, як у нашому вищезгаданому прикладі.

У вас є три варіанти, у всіх є переваги і недоліки:

  1. Використовуйте мову у нейтральному форматі
  2. Робіть місяць і рік очевидними
  3. Використовуйте Accept-Language HTTP заголовок

1-й варіант: Використовуйте мову у нейтральному форматі

ISO 8601 вказує формат YYYY-MM-DD. 2003-04-02 більш зрозумілий формат ніж 03/04/02. (Деякі вважають за краще модифікувати ISO 8601 за допомогою абревіатури для місяця, щоб зробити його більш зрозумілішим, наприклад 2003-Apr-02, але тоді це вже не буде нейтральна мова).

Плюси:

Мінуси:

2-й варіант: Робіть місяць і рік очевидними

Для цього використовуйте назву місяця (скорочено або повністю) і використовуйте 4 цифри для позначення року за Григоріанським календарем. Наприклад, 2 Квітня 2003.

Плюси:

Мінуси:

3-й варіант: Використовуйте Accept-Language HTTP заголовок

HTTP Accept-Language заголовок визначає тільки мову, якій користувачі надають перевагу, але він також зазвичай використовується для визначення того, якій локалі надається перевага.

Цей метод добре працює для динамічно створюваних веб документів, коли дата береться із деякої внутрішньої пам'яті сторінки, до тих пір поки зрозумілий формат дати, який очікує користувач. Відповідність є функцією мовного контексту, а не просто налаштуванням користувача в браузері. Наприклад:

Як це буде змінюватись в залежності від вашого середовища розробки. Ось деякі поради для деяких загальних середовищ.

Java/JSP

Викликайте ServletRequest метод getLocale або об'єкт HttpServletRequest. Використовуйте повернутий об'єкт Locale для того, щоб викликати DateFormat. Зверніть увагу, що SHORT (короткий) формат використовує тільки цифри. Якщо ви хочете однозначні формати, то використовує FULL (повний). У деяких мовах навіть формат LONG (довгий) - числовий.

Дивіться також ICU4J, так як вона містить більше сучасних даних (і більше функціональності) ніж JDK (Набір для Розробки Java).

ASP

Використовуйте Request.ServerVariables('HTTP_ACCEPT_LANGUAGE'), щоб отримати дані яким користувачі надають перевагу. Аналізуйте першу мову зі списку прийнятих мов. Ви повинні будете зробити своє власне відображення із літерного коду локалі в числовий Ідентифікатор Мови. Встановіть отримане значення в Session.LCID. Для форматування дати викликайте FormatDateTime.

Щоб уникнути двозначності, використовуйте vbLongDate.

Perl

Використовуйте $ENV{'HTTP_ACCEPT_LANGUAGE'}, щоб отримати мову, якій надають перевагу. Для форматування значень дати використовуйте POSIX:strftime. Ви повинні будете зробити своє власне відображення значення прийнятих мов у рядку із форматом дати.

Резюме

Немає ідеального рішення цієї проблеми. Зважте варіанти і виберіть найкращий варіант залежно від ваших вподобань і ситуації.

Якщо, ймовірно, буде будь-яка двозначність з боку користувача то, як правило, краще використовувати очевидні назви місяця і 4-значні роки за Григоріанським календарем, або принаймні вказати на сторінці як читати дати.

Дати можна переформатувати використовуючи динамічні методи відповідно до лінгвістичного контексту сторінки.

Доречі

Дехто виступає за створення тегу <date>, який би відображав дати відповідно до мови клієнтського додатку. Це залежить від тих самих практичних питань, які описані для динамічної генерації дати в Японському прикладі. Відповідний формат - це зазвичай функція лінгвістичного контексту сторінки, а не платформа користувача.