Различные результаты с LocalDateTime при разных вызовах с одним и тем же параметром - PullRequest
0 голосов
/ 18 января 2019

Проблема в том, что я должен изменить свой код с объекта Calendar на объект LocalDateTime. Но я не получаю ту же самую метку времени в конце. В первом вызове я получил то же самое с localDateTime, при следующих вызовах я получаю другие метки времени и использую тот же параметр для вычисления меток времени. Я не знаю, почему я получаю разные результаты. Это не логика для меня. То, что я хочу сделать, это: я получаю метку времени UTC. Я хочу установить его на немецкое (Европа / Берлин) время (важно для летнего и зимнего сезона). Затем я хочу вычислить начало дня (00:00) и конец дня (23:59). Тогда я хочу получить временную метку для этого времени.

Я создаю API с помощью Spring-Boot. Вышеописанная функция вызывается классом контроллера из spring-boot. При первом вызове после запуска API рассчитываются ожидаемые результаты. Но все последующие звонки дают другие результаты. Всегда с 7200 разницей. Я пробовал другие способы с localDateTime, но он никогда не дает такую ​​же временную метку, как с календарем.

LocalDateTimeWay:

LocalDateTime localDateTime = 
LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
LocalDateTime dayStartLocal = localDateTime.withHour(0)
    .withMinute(0)
    .withSecond(0)
    .withNano(0);

ZonedDateTime startZonedDateTime = dayStartLocal.atZone(ZoneId.systemDefault());
long dayStartTimeStamp = startZonedDateTime.toInstant().getEpochSecond();

LocalDateTime dayEndLocal = localDateTime.withHour(23)
    .withMinute(59)
    .withSecond(59)
    .withNano(999);

ZonedDateTime endZonedDateTime = dayEndLocal.atZone(ZoneId.systemDefault());
long dayEndTimeStamp = endZonedDateTime.toInstant().getEpochSecond();

CalendarWay:

Calendar cal=Calendar.getInstance();
cal.setTimeInMillis(timestamp*1000);
cal.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
long dayStartTimeStamp = calendar.getTimeInMillis()/1000L;

cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE,59);
cal.set(Calendar.SECOND,59);
cal.set(Calendar.MILLISECOND,999);

long dayEndTimeStamp = calendar.getTimeInMillis()/1000L;

Я хочу по метке времени параметра 1536933600. Результат 1536876000 и 1536962399. Но я получаю после первого запроса по методам localDateTime 1536883200 и 1536969599.

1 Ответ

0 голосов
/ 18 января 2019

Вы используете системную зону по умолчанию для кода java.time и зону Европа / Берлин для кода Calendar. 7200 - это, скорее всего, разница между системным часовым поясом и Европой / Берлином (2 часа).

Замените все ZoneId.systemDefault() на ZoneId.of("Europe/Berlin"), и вы получите одинаковые значения в обеих версиях:

timestamp = 1536933600
dayStartTimeStamp = 1536876000
dayEndTimeStamp = 1536962399
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...