В виду отмены перехода на зимнее время и обратно весьма актуальна проблема обновления временных зон. В Debian/Ubuntu проблема решается легко - обновлением пакета tzdata. К сожалению, часть приложений стоят особняком и данные для них приходится обновлять отдельно. В список «проблемных» программ попадают mysql со специальной утилитой и героиня поста - Java.
Для OpenJDK зоны вынесены в отдельный пакет tzdata-java и легко обновляются. Для Oracle (Sun) Java, которую требуют некоторые упёртые товарищи, придётся скачивать специальную утилиту - TZUpdater. Скачиваем, распаковываем, запускаем java -jar tzupdater.jar --update. После каждого изменения в часовых поясов утилита обновляется и её нужно снова скачивать.
Проверить корректность временных зон можно при помощи простой программы:
$ cat TestMSKtz.java
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class TestMSKtz {
public static void main(String[] args) {
Calendar cal = new GregorianCalendar();
System.out.printf("Local time: %04d-%02d-%02d %02d:%02d:%02d\n", cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DAY_OF_MONTH),cal.get(Calendar.HOUR_OF_DAY),cal.get(Calendar.MINUTE),cal.get(Calendar.SECOND));
cal = new GregorianCalendar(TimeZone.getTimeZone("Europe/Moscow"));
System.out.printf("Moscow time: %04d-%02d-%02d %02d:%02d:%02d\n", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
System.out.printf("UTC time: %04d-%02d-%02d %02d:%02d:%02d\n", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
}
}
$ javac TestMSKtz.java && java TestMSKtz
Local time: 2012-02-27 16:40:50
Moscow time: 2012-02-27 16:40:50
UTC time: 2012-02-27 12:40:50
После обновления зон нужно будет перезапустить java-приложения.