Мне нужна точная поддержка часовых поясов в моем приложении BlackBerry.Поскольку он запускает J2ME, Joda Time не вариант.С помощью некоторых других пользователей SO я выяснил, как сделать так, чтобы поддержка встроенного в Java часового пояса работала для меня, но оказалось, что переключение с летнего на не-дневной режим все равно происходит неправильно.Вы можете попробовать сами, даже на Java 6:
TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles");
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(zone);
calendar.set(2011, Calendar.MARCH, 13, 1, 0, 0);
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND)));
calendar.set(2011, Calendar.MARCH, 13, 6, 0, 0);
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND)));
calendar.set(2011, Calendar.MARCH, 13, 23, 59, 59);
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND)));
calendar.set(2011, Calendar.MARCH, 14, 0, 0, 1);
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND)));
Переключение в 2011 году произойдет 13 марта в 2 часа ночи, но в Java это произойдет в полночь 14 марта.Это означает, что это неправильно почти весь день.Это неприемлемо.
Я приступил к реализации собственного анализатора tzdata на основе this и доставке файлов tzdata с моим приложением, но мне интересно, есть ли лучший способ.Вы знаете один?Я не могу быть первым, кто решит эту проблему, не так ли?