Если я позвоню в моем приложении:
System.currentTimeMillis()
результат будет, скажем, 1536842771599, , то есть : GMT: четверг, 13 сентября, 2018 12: 46: 11,599 вечера ИЛИ в мой местный : четверг, сентябрь 13, 2018 3: 46: 11.599 вечера по Гринвичу + 03:00 по летнему времени
Если я сделаю следующее, выберите базу данных Oracle, установленную локально:
select CAST(sys_extract_utc(SYSTIMESTAMP) AS DATE) from dual;
Я получаю через следующий код JdbcTemplate:
jdbc.queryForObject(sqlCommand, new Object[0], Timestamp.class);
следующий результат:
Что, на мой взгляд, уже неверно, поскольку метка времени обычно представляет собой локализованное время. Далее, если я позвоню:
myResult.getTime()
чтобы получить длинное значение, это конвертирует мое время, которое было около 12.46 PM, в значение 1536831971599, которое на самом деле: GMT: четверг, 13 сентября, 2018 9: 46: 11.599 AM.
Очевидно, что это не очень хорошо, потому что это на 2 * GMT + 03: 00 (6 часов) отстает от моего фактического местного времени, а GMT + 03: 00 (3 часа) отстает от времени UTC Базы данных.
Что я делаю не так? Мой единственный вывод до сих пор состоит в том, чтобы не делать sys_extract_utc для базы данных и позволить базе данных возвращать мне местное время, которое будет преобразовано в время UTC, когда я вызову getTime для экземпляра Timestamp.
Есть какое-нибудь объяснение этому?
P.S.
Основываясь на ответе о том, что java.sql.Timestamp - это UTC, я прилагаю скриншот того, что мне показывает отладчик, и что это неверно, потому что он считает результат, который является UTC, GMT + 03: 00. Итак, он показывает мое время как 8,26 + 03:00. Мое местное время 11.26. Если я вызову getTime для этого экземпляра Timestamp, я получу длинное значение, которое, если я введу в https://www.epochconverter.com/, получу пятницу, 14 сентября, 2018 8:26:06 AM GMT + 03: 00 DST или пятницу , 14 сентября 2018 года, 5:26:06, что ровно на 3 часа меньше, чем у меня на UTC!
P.S.2
Я использую Spring JDBC 4.2.5-RELEASE. Не может использовать Instant с ним, он генерирует исключение, которое не может конвертировать Timestamp в Instant, потому что он ожидает что-то, что происходит от Number. Я не могу изменить этот JDBC, даже версию, сейчас, к сожалению.