Пример получения параметра tz
Параметр tz хранит часовой пояс и настройки перехода на летнее время (DST) в одном 32-битном целом числе со знаком. В свойствах пользователя это значение называется tz. В запросе render/set_locale оно называется tzOffset.
Структура tz
Значение tz состоит из следующих частей:
| Биты | Маска | Содержимое |
|---|---|---|
| 0–15 | 0x0000FFFF |
Смещение относительно UTC в секундах |
| 16–27 | 0x0FFF0000 |
Настройки перехода на летнее время. Возможные значения приведены в разделе Летнее время. |
| 28–31 | 0xF0000000 |
Знак смещения относительно UTC. Если смещение отрицательное, установлены все четыре бита. |
Знак смещения относительно UTC определяется по биту 31, а не по биту 15. Например, у смещения +10:00 (36000, или 0x8CA0) бит 15 установлен, но смещение положительное.
Если tz & 0x0C000000 не равно 0x08000000, значение записано в старом формате. В этом формате смещение относительно UTC в секундах равно tz & 0xFFFFFFFE, а бит 0 определяет переход на летнее время: если бит 0 установлен, летнее время не используется; если не установлен, переход на летнее время выполняется согласно настройкам сервера.
Все описанные ниже операции выполняйте над 32-битными целыми числами со знаком. В языках, где используются 64-битные целые числа (например, Python или PHP), преобразуйте результаты в 32-битные значения со знаком. Иначе -3600 & 0xF000FFFF вернет 4026593776 вместо -268373520.
Кодирование tz
Ниже приведен пример для смещения относительно UTC -01:00 (-3600) без перехода на летнее время (0x08000000). Смещения всех часовых поясов приведены в разделе Часовые пояса.
-
Примените к смещению относительно UTC побитовое И с маской
0xF000FFFF. Маска сохраняет смещение в битах 0–15 и знак в битах 28–31. Если вместо нее использовать маску0xFFFF, знак теряется, и сервер воспринимает -01:00 как +17:12.-3600 & 0xF000FFFF -268373520 -
Примените к результату побитовое ИЛИ со значением летнего времени. Если переход на летнее время не используется, значение равно
0x08000000.-268373520 | 0x08000000 -134155792
Итоговое значение tz равно -134155792 (0xF800F1F0).
Декодирование tz
Чтобы получить смещение относительно UTC и настройки перехода на летнее время из tz = -134155792, выполните следующие действия:
-
Примените к
tzпобитовое И с маской0xFFFF:-134155792 & 0xFFFF 61936 -
Если
tzотрицательное (бит 31 установлен), примените к результату побитовое ИЛИ с маской0xFFFF0000, чтобы восстановить знак:61936 | 0xFFFF0000 -3600Смещение относительно UTC составляет
-3600секунд, то есть -01:00. -
Чтобы получить настройки перехода на летнее время, примените к
tzпобитовое И с маской0x0FFF0000:-134155792 & 0x0FFF0000 0x08000000Значение
0x08000000означает, что переход на летнее время не используется.