Перевод часов в России 26 октября и Java

в 6:01, , рубрики: java, MSK, tzdata

Всем привет!

Многие знакомые программисты считают, что для того, чтобы перевести часы в 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);

        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

Надеюсь, все вовремя обновятся и у нас не будет остановки половины софта в воскресенье/понедельник.

Автор: werewolfspb

Источник

Поделиться

* - обязательные к заполнению поля