четверг, 2 октября 2014 г.

Java, Joda-Time и перевод времени

В РФ снова 26 октября осуществляется переход на зимнее время. Далее время не будет переводиться, конечно если наше правительство не примет новый закон.

Т.е. Москва и регионы находящиеся с ней в одном часовом поясе будут жить по зимнему времени всегда.

В java используются свои таймзоны (tzdata), которые могут отличаться от системной. Более того в библиотеке JodaTime используется свой файл tzdata, который вкомпилен в библиотеку.

Более того, если у вас установлены несколько версий java, нужно внимательно проверить из-под какой версии вы запускаете tzupdater. Мы с ребятами долго не могли понять, почему версии 1.7.0_21 и 1.7.0_55 не подхватывают новые таймзоны, а последняя 1.7.0_67 подхватывала без проблем.

Итак, в java установлена tzdata2014g. Но в тоже время в JodaTime используется другая версия tzdata. Из-за этого java.util.Date и DateTime возвращают разное время при одинаковом Unix time.

Из-за этого не корректно работает конвертация Date в DateTime. Кол-во миллисекунд внутри объектов одинаково, а время получается разное... А такого кода в проекте может быть очень много.

Одно из решений - обновить таймзоны еще и в JodaTime, пересобрав библиотеку с tzdata2014g. Естественно и в java обязательно должна использоваться такая же tzdata.

UPD: Вышла JodaTime 2.5, в которой используется DateTimeZone 2014h.