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