Получение разных временных отметок (времени эпохи) локально и удаленно при использовании LocalDateTime в SpringBoot - PullRequest
0 голосов
/ 02 июня 2019

Я печатаю время эпохи, используя LocalDateTime, как это

System.out.println("timestamp "+LocalDateTime.now().atZone(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli());

Таким образом, всякий раз, когда я запускаю этот фрагмент кода локально в Intellij, я получаю правильную временную метку с часовым поясом Калькутты, которая составляет приблизительно 1559461130527. Это около Sunday, June 2, 2019 1:23:50.527 PM Калькутта

Затем у меня есть сервер с док-контейнером, и всякий раз, когда я запускаю этот кусок кода, я получаю совершенно другую временную метку, которая составляет приблизительно 1559439902340. Это около Sunday, June 2, 2019 7:30:02.340 AM.

Чего мне не хватает, разве сервер не должен печатать отметку времени в соответствии с указанным часовым поясом. Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Вы должны использовать смещение зоны в выражении now ().

Например, чтобы получить время UTC, я использую LocalDateTime.now(ZoneOffset.UTC);

В вашем случае вы можете использовать непосредственно ZoneId для вашегочасовой пояс

LocalDateTime.now(ZoneId.of("Asia/Kolkata"));

0 голосов
/ 02 июня 2019

Если вы посмотрите на реализацию метода LocalDateTime::now, который выглядит следующим образом:

public static LocalDateTime now() {
    return now(Clock.systemDefaultZone());
}

Таким образом, он будет использовать Clock реализацию по умолчанию для вашей системы. Возможно, вы используете другую операционную систему в своем контейнере, и поэтому будут использоваться разные часы по умолчанию.

Таким образом, вызов метода LocalDateTime::now в вашем случае будет возвращать различные значения в зависимости от системного значения по умолчанию Clock. И затем, если вы хотите преобразовать его в ZonedDateTime с использованием метода atZone - у вас будет разное время в одной и той же зоне - потому что LocalDateTime::now вернул разные значения для разных часов по умолчанию в разных операционных системах.

Чтобы преодолеть это, вы можете использовать класс ZonedDateTime напрямую и передать зону в now метод:

ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();
...