[Из песочницы] Перевод часов в России 26 октября и Java

Всем привет! Многие знакомые программисты считают, что для того, чтобы перевести часы в Java на новую Московскую таймзону (которая наступит уже 26 октября, таймзона Europe/Moscow станет равна GMT+3, а не GMT+4, как сейчас — и все остальные русские таймзоны тоже), достаточно поставить на Windows обновления, а на Unix — JDK версии 1.7.0_72 (в статье речь про JDK7, однако информация актуальна для любой ветки, это касается и 5, и 6, и 8).

Так вот, это заблуждение — просто апгрейд JDK на Unix до 1.7.0_72 не годится.Внутри JDK пакетов есть файлики таймзон (пакет tzdata), вот здесь указано, какой пакет в какой дистрибутив входит и указан контент tzdata пакетов: www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html

Как видно, чтобы получить апдейт к русским таймзонам, нужен пакет как минимум tzdata2014f.При этом в последних версиях JDK присутствует только tzdata2014c.

Как это решить? Предположим, что у вас уже настроено:

user@host:/home/user$ echo $JAVA_HOME /usr/lib/jvm/java-7-oracle Тогда вам достаточно поставить отдельно пакет tzdata-java:

user@host:/home/host$ sudo apt-get install tzdata-java Затем указать используемой Java (например, той, которая связана с переменной JAVA_HOME) брать файлики таймзон из пакета tzdata-java. Для этого имеет смысл стереть или переименовать каталог с файликами таймзон внутри JDK и поставить символическую ссылку на /usr/share/javazi:

mv $JAVA_HOME/jre/lib/zi $JAVA_HOME/jre/lib/zi-default ln –s /usr/share/javazi/ $JAVA_HOME/jre/lib/zi Проверить можно следующим кодом на Java: import java.util.*; import java.text.DateFormat;

public class TestMSK { public static void main (String[] args) {

Calendar c = Calendar.getInstance (TimeZone.getTimeZone («Europe/Moscow»)); DateFormat df = DateFormat.getDateTimeInstance (DateFormat.FULL, DateFormat.FULL, Locale.US); df.setCalendar©;

c.setTimeInMillis (1413769091L * 1000L); if (! df.format (c.getTime ()).equals («Monday, October 20, 2014 5:38:11 AM MSK»)) { System.out.println («FAIL1 — 20 Oct is not in sync »); System.out.println (df.format (c.getTime ())); System.exit (1); }

c.setTimeInMillis (1414633091L * 1000L);

if (! df.format (c.getTime ()).equals («Thursday, October 30, 2014 4:38:11 AM MSK»)) { System.out.println («FAIL2 — 30 Oct is not in sync»); System.out.println (df.format (c.getTime ())); System.exit (2); }

System.out.println («OK»); System.exit (0); } } Проверка: user@host:/home/user$ javac -cp. TestMSK.java user@host:/home/user$ user@host:/home/user$ java -cp. TestMSK OK Надеюсь, все вовремя обновятся и у нас не будет остановки половины софта в воскресенье/понедельник.

© Habrahabr.ru