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())