SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Неизвестная time zone и ucal_open [ICU] (пятничный треш / развлечение)
Неизвестная time zone и ucal_open [ICU] [сообщение #2670] Fri, 30 June 2023 09:36 Переход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
С пятницей.

Опишу эксперимент - может чего сам пойму Smile

Как широко известно в узких кругах, для обработки часовых зон FB использует ICU.

Если вы передадите серверу неизвестное ИМЯ часовой зоны - "Kurope/Moscow", сервер вернет ошибку "Invalid time zone region: Kurope/Moscow":

/index.php/fa/138/0/

Возник вопрос - а что будет, если в само ICU засунуть неизвестное имя часовой зоны?

Если более конкретно - как поведет себя ICU-шная функция ucal_open с неизвестным именем timezone?

В случае сервера, мы можем вызвать ucal_open с помощью запроса
select extract(TIMEZONE_HOUR  from cast('2023-06-19 10:02:30 Europe/Moscow' as timestamp with time zone)) from rdb$database;
С помощью отладчика, меняем внутрях у отладочного сервера название timezone "Europe/Moscow" (id: 65064) на "Kurope/Moscow".

/index.php/fa/139/0/

И видим, что ICU без ошибок переваривает это имя. Extract TIMEZONE_HOUR возвращает 0:

/index.php/fa/140/0/

Чтобы убедиться, что сервер реально сломан, выполним простой запрос с преобразованием туда и обратно:

select cast(cast('2023-06-19 10:02:30 Europe/Moscow' as timestamp with time zone) as VARCHAR(128)) from rdb$database;
Видим, что таки да - сервер мы поломали правильно:

/index.php/fa/142/0/

---
Пока ваял этот спич, подумал - может надо было сломать пожостче. Скажем, поменять имя нашей часовой зоны 65064 на "Kurope/Loscow"?

ucal_open и такое переваривает без ошибок.

Обратная проверка:

/index.php/fa/143/0/

---
Вывод - походу если ICU перестанет поддерживать какой-нибудь часовой пояс, то сервер это дело не прорюхает. И, возможно, будут проблемы.

Короче, (риторические) вопросы - кто виноват и чего делать-то? Laughing

---
Всем бобра и хорошего настроения.
Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2673 является ответом на сообщение #2670] Fri, 30 June 2023 11:36 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 139
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
С временнЫми зонами все гораздо сложнее.

Мало того что они должны быть с нужным именем, так еще и информация об этой зоне должна быть актуальна не только на текущий момент, но и на прошлые и на будущие.
Если с прошлым более-менее ясно, то с текущим и будущим - сложнее. Данные про зону - не константа и меняются со временем. Причем от фактически законодательного решения о смене информации о зоне, до попадания этой инфы в базу tzdata, и попадание оттуда в локально установленную ICU-библиотеку, или в локальную БД по tzdata - пройдет некоторое время. В моем случае, информация по изменениям в мой зоне не попадали в первоисточник несколько месяцев, и даже когда попали, то оказалось что на текущем сервере стоит старый пакет tzdata который не умеет брать данные в новом формате, а старого формата или уже нет или он не обновляется.

https://habr.com/ru/articles/130401/

По этой причине я бы крайне осторожно относился к внедрению такого формата даты-времени в базу. Ибо это лишние зависимости от окружающей системы и мира. Либо самостоятельно контролировать и поддерживать актуальность необходимых зон.

[Обновления: Mon, 03 July 2023 03:44]

Известить модератора

Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2674 является ответом на сообщение #2673] Fri, 30 June 2023 11:47 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 139
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
Я когда смотрел инфу по своей таймзоне в базе, то на моей памяти вроде бы было 2 изменения. А оказалось что порядка 6-8 изменений, точно не помню, но гораздо больше чем я ожидал. Там не только смещение от GMT, но и различные флюктуации с летним/зимним временем - то оно есть, то нету, то нету но все время по зимнему, но нету но все время по летнему, и т.п.

И кстати, все эти штуки приводят к тому что временные диапазоны по локальному времени считать будет не совсем корректным.

[Обновления: Mon, 03 July 2023 03:48]

Известить модератора

Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2678 является ответом на сообщение #2674] Fri, 30 June 2023 15:48 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
Владимир! Ну зачем ты так!
я настроился на лёгкий пятничный околокомпьютерный трёп, пиво достал из холодильника...
а ты вот так вот, бах! фактами по голове!
я даже зажмуриться не успел.
всё, пропал вечер...
Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2680 является ответом на сообщение #2678] Fri, 30 June 2023 16:13 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
МП писал(а) Fri, 30 June 2023 15:48
Владимир! Ну зачем ты так!
я настроился на лёгкий пятничный околокомпьютерный трёп, пиво достал из холодильника...
а ты вот так вот, бах! фактами по голове!
я даже зажмуриться не успел.
всё, пропал вечер...
https://www.youtube.com/watch?v=wBiIsgTIjdg
Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2681 является ответом на сообщение #2673] Fri, 30 June 2023 16:26 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
fraks писал(а) Fri, 30 June 2023 11:36
С временнЫми зонами все гораздо сложнее.
Насчет TZ Database.

Сдается мне, для локальных вычислений было бы неплохо клиенту получать эту базу от сервера (Firebird) и скармливать её локальному ICU.

Но я не вижу такой возможности ни у ICU, ни у сервера.

И кста (может Влад подскажет) - а как я могу (программно) узнать у сервера версию используемой TZ Database? Я чета с ходу не нашел...
Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2685 является ответом на сообщение #2681] Sat, 01 July 2023 20:08 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 357
Зарегистрирован: August 2022
Senior Member
Dmitry Kovalenko писал(а) Fri, 30 June 2023 16:26
И кста (может Влад подскажет) - а как я могу (программно) узнать у сервера версию используемой TZ Database? Я чета с ходу не нашел...
А как искал ?
doc\sql.extensions\README.time_zone.md
### Function `DATABASE_VERSION`

`RDB$TIME_ZONE_UTIL.DATABASE_VERSION` returns the time zone database version.
Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2686 является ответом на сообщение #2670] Sat, 01 July 2023 20:10 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 357
Зарегистрирован: August 2022
Senior Member
Dmitry Kovalenko писал(а) Fri, 30 June 2023 09:36
И видим, что ICU без ошибок переваривает это имя. Extract TIMEZONE_HOUR возвращает 0:
Пиши трекеру. Ихнему.
Это баг в ICU, imho
Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2689 является ответом на сообщение #2685] Mon, 03 July 2023 08:06 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
hvlad писал(а) Sat, 01 July 2023 20:08

doc\sql.extensions\README.time_zone.md
### Function `DATABASE_VERSION`

`RDB$TIME_ZONE_UTIL.DATABASE_VERSION` returns the time zone database version.
Спасибо. Это я уже затупил на ровном месте.

hvlad писал(а) Sat, 01 July 2023 20:08

Это баг в ICU, imho
Ну это, как бы, задокумментированное поведение. Так что это типа фича ...

Note: When unknown TimeZone ID is specified or if the TimeZone ID specified is "Etc/Unknown", the UCalendar returned by the function is initialized with GMT zone with TimeZone ID UCAL_UNKNOWN_ZONE_ID ("Etc/Unknown") without any errors/warnings.

Я у себя решил после ucal_open вызывать ucal_getTimeZoneID и ругаться если полученная строка отличается от ожидаемой.
Re: Неизвестная time zone и ucal_open [ICU] [сообщение #2691 является ответом на сообщение #2689] Mon, 03 July 2023 10:23 Переход к предыдущему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 357
Зарегистрирован: August 2022
Senior Member
Dmitry Kovalenko писал(а) Mon, 03 July 2023 08:06

hvlad писал(а) Sat, 01 July 2023 20:08
Это баг в ICU, imho
Ну это, как бы, задокумментированное поведение. Так что это типа фича ...
Кому и фича - бага Smile
Я высказал своё мнение, могут быть и другие. Ты знаешь, где их плучить Wink
Предыдущая тема: Точность TIMESTAMP
Следующая тема: clumplet too long (FB4)
Переход к форуму:
  


Текущее время: Thu Nov 21 19:15:43 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00814 секунд