Почему 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 ().