Хорошо, что вы нашли решение, я просто хотел бы добавить некоторые идеи и предложить небольшое улучшение к вашему ответу.
Установка часового пояса JVM по умолчанию с использованием TimeZone.setDefault
— не лучший способ добиться этого. Хотя это может работать в большинстве случаев, это немного рискованно и подвержено ошибкам, если вы считаете, что этот код работает в более сложной среде.
Это связано с тем, что TimeZone.setDefault
изменяет часовой пояс по умолчанию для всего JVM. Это повлияет на любое другое приложение, работающее в той же JVM. Другие части того же приложения также будут затронуты, и даже этот же код, работающий в нескольких потоках, может дать вам неправильные результаты (и условия гонки сложно отлаживать).
Я заметил, что вы используете TimeZone.setDefault(TimeZone.getTimeZone(timezone));
. Это означает, что вы уже работаете с определенным часовым поясом, поэтому нет необходимости полагаться на значение по умолчанию JVM. Если у вас есть конкретное имя часового пояса, просто используйте его вместо имени по умолчанию. Поэтому я предлагаю вам, чтобы метод addDays
был таким:
public ZonedDateTime addDays(long myUTCTimeInSeconds, int days, String timezone) {
// get the instant from the UTC seconds
Instant instant = Instant.ofEpochSecond(myUTCTimeInSeconds);
// get the instant at the specified timezone
ZonedDateTime z = instant.atZone(ZoneId.of(timezone));
// add days
return z.plusDays(days);
}
Сделаны улучшения:
plusDays
уже вычитает 1 день, если передать ему -1
. Нет необходимости проверять значение и использовать метод abs
.
- не используйте часовой пояс JVM по умолчанию: вместо
ZoneId.systemDefault()
используйте timezone
, который у вас уже есть (тот, который вы использовали в методе setDefault
)
instant.atZone
эквивалентно ZonedDateTime.ofInstant
. ИМО, atZone
более "читабелен", но в данном случае это вопрос выбора и стиля кода. На окончательный результат это не влияет.
При этом вы можете сделать:
// call directly, no need to change the default timezone
System.out.println(addDays(1459123200, -1, "Europe/Stockholm"));
Это напечатает:
2016-03-27T03:00+02:00[Европа/Стокгольм]
person
Community
schedule
11.09.2017
LocalDateTime
. - person RealSkeptic   schedule 22.02.2017