Мой первый ответ: вам не нужно беспокоиться о настройке часового пояса по умолчанию в вашей JVM. Ваш Java код не должен полагаться на него в любом случае. Установку по умолчанию можно изменить в любой момент из другой части вашей программы или из другой программы, работающей в той же JVM, как и fr agile. Вместо этого укажите явный часовой пояс в ваших чувствительных к часовому поясу операциях.
Если вы все еще хотите полагаться на значение по умолчанию, вот хак, чтобы установить его на некоторый континент / город часовой пояс, если это произойдет быть GMT-05:00
, что вы считаете нежелательным.
ZoneId defaultZoneId = ZoneId.systemDefault();
ZoneId desiredTimeZone = null;
if (defaultZoneId.equals(ZoneId.of("GMT-05:00"))) {
// Pick a date in summer
LocalDate dateInSummer = Year.now().atMonthDay(MonthDay.of(Month.JULY, 7));
DateTimeFormatter zoneFormatter = DateTimeFormatter.ofPattern("zzzz", Locale.ENGLISH);
for (String zid : ZoneId.getAvailableZoneIds()) {
ZoneId zone = ZoneId.of(zid);
String timeZoneName = dateInSummer.atStartOfDay(zone).format(zoneFormatter);
if (zid.startsWith("America/") && timeZoneName.equals("Eastern Standard Time")) {
desiredTimeZone = zone;
break;
}
}
}
System.out.println("Time zone: " + desiredTimeZone);
На моем JDK 11 я получил:
Часовой пояс: Америка / Панама
Чтобы установить его как значение по умолчанию, мы, к сожалению, должны go через плохо спроектированный и в противном случае давно устаревший класс TimeZone
:
TimeZone.setDefault(TimeZone.getTimeZone(desiredTimeZone));
Есть еще одна причина, чтобы предостеречь от использования Америки / Панамы или некоторых других идентификатор часового пояса вместо GMT-05: 00: хотя в Панаме с некоторого времени 1908 года смещение -05: 00 от GMT / UT C используется не всегда, поэтому для исторических дат c вы получите неправильное время его использования.
Согласно timeanddate.com, места, которые используют восточное стандартное время в течение всего года (без летнего времени / летнего времени):
- Нунавут - только остров Саутгемптон ( Корал Харбор) (Канада) (Америка / Кор часовой пояс al_Harbour)
- Кинтана-Роо (Мексика) (часовой пояс Америки / Канкуна)
- Каймановы острова (Америка / Кайман)
- Ямайка (Америка / Ямайка)
- Панама (Америка / Панама)
Мой Java дополнительно перечисляет Америку / Атикокан (также в Канаде).
В списке нет места в Соединенных Штатах. Состояния. Я считаю, что ни один из вышеперечисленных не всегда использовал смещение -05:00
. То есть каждый из них имел разное смещение в определенный момент истории, и Java будет использовать это разное смещение для исторических дат c.
Так какой часовой пояс использовать?
Редактировать: Андреас в комментарии указал, что ни у Etc / GMT + 5, ни у SystemV / EST5 нет проблемы, о которой я упоминал, относительно применения смещений к историческим датам c, которые, вероятно, являются неожиданными. Так что вы можете рассмотреть один из них. Плюсы каждого, как я их вижу:
America/Xxx Etc/GMT+5 SystemV/EST5 GMT-05:00
Official IANA time zone? Yes Yes
With slash? Yes Yes Yes
Continent/city? Yes
Good for historical dates? Yes Yes Yes
Prints as EST/Eastern Standard Time? Yes Yes
(Ваша отправная точка, GMT-05: 00, включена только для сравнения. И какие из них действительно хороши для исторических дат c конечно, зависит от того, что вам нужно для них.)
Ссылки