Как использовать идентификатор часового пояса Java в приложении Windows (не Java)?

Мне нужно добавить информацию о часовом поясе в таблицу db с местоположениями, поддерживаемыми пользователем. Доступ к данным будет осуществляться в основном из кода Java, но есть также некоторый код PL / SQL и Win32 (Delphi), который должен понимать информацию о часовом поясе.

Кажется, прямолинейно использовать идентификатор из java.util.TimeZone. Java может легко преобразовать это (очевидно), Hibernate имеет встроенную поддержку для него, и, по-видимому, Oracle также понимает эти идентификаторы часовых поясов:

select TZ_OFFSET('Pacific/Marquesas') from dual.

Проблема в том, что идентификаторы часовых поясов не совместимы с базой данных часовых поясов Windows. Например, идентификатор java.util.timezone "Pacific / Marquesas" (-09: 30) отсутствует в списке выбора часового пояса в Windows. В реестре его вообще нет; видеть

\ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones

Здесь я могу выбрать только -09: 00 или -10: 00. Итак, если бы я сохранил часовой пояс таким образом, как я могу получить фактическую информацию о смещении / летнем времени в Windows (без Java)? Надеюсь, для этого не требуется таблица сопоставления, которую я должен обновлять всякий раз, когда она изменяется. Есть ли общепринятый стандарт, который работает лучше, чем идентификатор часового пояса Java?

Обновлять

Информация о часовом поясе используется в сочетании со столбцами DATE в базе данных. Эти столбцы содержат локальные значения даты и времени. Если местоположение может быть связано с этими значениями, часовой пояс местоположения позволяет мне при необходимости преобразовывать значение даты / времени в UTC или любой другой часовой пояс.

Я понимаю, что вместо DATE тип данных TIMESTAMP_TZ или что-то подобное было бы более подходящим. Однако это потребует миграции данных (для которой снова требуется TZ) и не поддерживается устаревшими приложениями, которые также работают с данными (если не изменен большой объем кода). Проблема почти такая же, если бы мне пришлось преобразовать значения в UTC.

Суть в том, что мне нужно сохранить значения DATE по местному времени, но мне нужно знать для некоторых из них, что это означает TZ.

Ответов (2)

Решение

Я могу дать небольшую предысторию, если не настоящий ответ.

Многие системы используют реализацию данных часового пояса Олсона . Так что эти имена работают во многих системах (я думаю, в большинстве Unix, Java, Oracle). Microsoft делает свое дело.

Я вижу, что внизу этой ссылки на Википедию есть ссылка на некое сопоставление с миром Windows.

Удачи!

Я понимаю, что это не лучший способ сделать это, но в вашем случае этого может быть достаточно. Не зная всех требований, я не могу сказать.

Для чего вам нужно использовать информацию о часовом поясе? Просто для того, чтобы представить время с правильным смещением и, может быть, также название часового пояса?

Вы можете продолжать использовать Java для определения смещения пользователя, просматривая выбранный пользователем часовой пояс с помощью Java. Каждый раз, когда пользователь входит в вашу базу данных, записывайте текущее смещение. Затем другие приложения могут просмотреть эту информацию, чтобы определить, как отформатировать время.

Это предполагает, что это необходимо сделать именно для пользователей, которые регулярно входят в систему. Если это не так, вы можете запускать ежедневное задание для поиска часового пояса для каждого пользователя в Java и записи действующего смещения.

Хакерский, согласен, но я вижу единственный другой способ - это поддерживать отображение. А что происходит, когда кто-то выбирает часовой пояс, для которого у вас нет сопоставления?