Почему Java 8 Instant.now () показывает неправильный UTC на моем локальном сервере? - PullRequest
0 голосов
/ 01 декабря 2018

Java8 Instant.now() показывает текущее время, уже отформатированное в UTC.Я создал простой тест «песочницы» на CompileJava.net , чтобы проверить мои ожидаемые результаты:

Timestamp createdDateUtc = Timestamp.from(Instant.now());
System.out.println(createdDateUtc);

LocalDateTime databaseUtcLocal = createdDateUtc.toLocalDateTime();
ZonedDateTime databaseUtcZoned = databaseUtcLocal.atZone(ZoneId.of("UTC"));
ZonedDateTime userTimezoneTime = databaseUtcZoned.withZoneSameInstant(ZoneId.of("Asia/Qatar")); 
System.out.println(userTimezoneTime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a")));

Примечание: это в настоящее время 11:16 UTC 12/01/2018.

Когда я запускаю этот код на онлайн-компиляторе, я получаю вывод:

2018-12-01 11:17:43.637
12/01/2018 02:17:43 PM

Но когда я запускаю этот код на своем локальном сервере JBOSS, я получаю этот выводвместо этого:

2018-12-01 03:18:07.464
12/01/2018 06:18:07 AM

Что здесь может пойти не так?Неправильные ли часы UTC моего сервера?Физическое местоположение моего локального сервера в Калифорнии.Хотя это не должно иметь значения, кажется странным, что когда я пытаюсь отобразить время UTC, используя Instant.now(), вместо этого я получаю тихоокеанское время.

Любая помощь очень ценится!

ОБНОВЛЕНИЕ

Как указано в принятом ответе, проблема была в моем Timestamp.from() методе:

System.out.println(Instant.now());
System.out.println(Timestamp.from(Instant.now()));

Вывод:

2018-12-01T11:48:33.153Z
2018-12-01 03:48:33.171

Так что теперь моя проблема изменилась.Если у вас есть похожая проблема, я нашел свой ответ по этому переполнению стека здесь .Вместо Timestamp.from(Instant.now()) я использовал этот безобразный беспорядок:

Timestamp.valueOf(ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime())

1 Ответ

0 голосов
/ 01 декабря 2018

Я думаю, что есть проблема в методе Timestamp.toString().Если вы заглянете внутрь, то увидите:

public String toString () {

    int year = super.getYear() + 1900;
    int month = super.getMonth() + 1;
    int day = super.getDate();
    int hour = super.getHours();
    int minute = super.getMinutes();
    int second = super.getSeconds();
    // other code
}

Методы getHours(), getMinutes() и другие относятся к классу Date и на основании документации они интерпретируют его по местному часовому поясу Дата.getHours () .

...