Справочный центр Wialon

Пример получения параметра 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). Смещения всех часовых поясов приведены в разделе Часовые пояса.

  1. Примените к смещению относительно UTC побитовое И с маской 0xF000FFFF. Маска сохраняет смещение в битах 0–15 и знак в битах 28–31. Если вместо нее использовать маску 0xFFFF, знак теряется, и сервер воспринимает -01:00 как +17:12.

    Copied!
    -3600 & 0xF000FFFF
    -268373520
    
  2. Примените к результату побитовое ИЛИ со значением летнего времени. Если переход на летнее время не используется, значение равно 0x08000000.

    Copied!
    -268373520 | 0x08000000
    -134155792
    

Итоговое значение tz равно -134155792 (0xF800F1F0).

Декодирование tz

Чтобы получить смещение относительно UTC и настройки перехода на летнее время из tz = -134155792, выполните следующие действия:

  1. Примените к tz побитовое И с маской 0xFFFF:

    Copied!
    -134155792 & 0xFFFF
    61936
    
  2. Если tz отрицательное (бит 31 установлен), примените к результату побитовое ИЛИ с маской 0xFFFF0000, чтобы восстановить знак:

    Copied!
    61936 | 0xFFFF0000
    -3600
    

    Смещение относительно UTC составляет -3600 секунд, то есть -01:00.

  3. Чтобы получить настройки перехода на летнее время, примените к tz побитовое И с маской 0x0FFF0000:

    Copied!
    -134155792 & 0x0FFF0000
    0x08000000
    

    Значение 0x08000000 означает, что переход на летнее время не используется.

Если вы заметили ошибку в тексте, пожалуйста, выделите её и нажмите Ctrl+Enter.