Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 17 из 20V. Данные и доверие125 минут

Глава 17. Время, locale и интернационализация как данные

Момент времени, настенные часы, язык и правила сортировки — разные данные; глобальная locale процесса не должна тайно менять контракт Pulse.

После главы вы сможете
  • различать instant и local time
  • форматировать через Intl
  • внедрять Clock

Событие хранит момент

occurredAt Pulse — однозначный instant. Он поступает как ISO 8601 с offset, преобразуется в DateTimeImmutable и хранится в UTC. Отображение получает timezone пользователя отдельно. Название зоны IANA важно для будущих правил, потому что offset не описывает изменения законодательства.

Локальное расписание «каждый день в 09:00» нельзя реализовать бесконечным прибавлением 24 часов к UTC: при DST настенный час сдвинется или окажется неоднозначным.

От факта к представлению

Локализованный отчётХранилище сохраняет факт, а локализованная строка создаётся только для конкретного зрителя.InstantUTCViewertime zoneLocalelanguageFormatterIntlTextdisplay only
Хранилище сохраняет факт, а локализованная строка создаётся только для конкретного зрителя.

DateTimeImmutable и parser

Immutable API уменьшает случайное изменение общей ссылки, но строковый конструктор принимает много форматов. На внешней границе используйте createFromFormat с точным шаблоном и проверяйте getLastErrors. Относительные слова now и tomorrow не являются wire format.

Clock по PSR-20 или собственному узкому интерфейсу передаёт текущий момент. Тест фиксирует время без изменения глобальной timezone и sleep.

Locale не равна языку строки

Locale влияет на формат числа, даты и collation, но не меняет кодировку PHP-строки. NumberFormatter разбирает пользовательское число в известной locale, после чего предметная модель хранит точное значение и единицу.

setlocale меняет глобальное состояние процесса и может повлиять на сторонний код. Объектные Intl formatter с явной locale лучше изолируют решение.

Сортировка и стабильность

Алфавитный порядок зависит от locale и версии ICU. Если порядок является частью pagination cursor или подписи, нельзя строить его только на локализованном отображении. Pulse хранит стабильный технический ключ и отдельно сортирует подписи для UI.

Версия timezone database и ICU относится к платформе. Обновление требует тестов пограничных зон и снимков формата, но строка интерфейса не должна становиться persisted contract.

Лаборатория

Отформатируйте один instant для Europe/Moscow и Europe/Berlin, проверьте переход DST и распарсьте число в ru_RU. Сохраните только канонические значения.

  • now поступает через Clock.
  • Timezone указана явно.
  • Локализованная строка не записывается как источник истины.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Достаточно ли offset +03:00 для будущего расписания?
2. Где хранить локализованную строку даты?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/manual/en/book.intl.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php-fig.orghttps://www.php-fig.org/psr/psr-20/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie