Почему Java 8 Instant.now() показывает неверный UTC на моем локальном сервере?

Java8 Instant.now() показывает текущее время, уже отформатированное в формате UTC. Я создал простой тест песочницы на https://www.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 ответ

Решение

Я думаю, что есть проблема в 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 класс и на основе документации они интерпретируют его по местному часовому поясу Date.getHours ().

Другие вопросы по тегам