Предполагая, что вы используете хотя бы JDBC 4.2, вы сможете извлечь LocalTime
из вашего набора результатов:
LocalTime timeInUtc = yourResultSet.getObject(yourTimeColumn, LocalTime.class);
Тогда вам не нужно беспокоиться об устаревших и плохо спроектированных java.sql.Time
учебный класс.Конечно, время, которое вы получите, все еще будет в UTC.Вот как конвертировать:
LocalTime timeInUtc = LocalTime.of(3, 0);
ZoneId zone = ZoneId.of("Europe/Berlin");
LocalTime timeInGermany = OffsetDateTime.now(ZoneOffset.UTC)
.with(timeInUtc)
.atZoneSameInstant(zone)
.toLocalTime();
System.out.println("Zeit heute in Deutschland: " + timeInGermany);
Когда я запускал код сегодня, я получил ожидаемый результат:
Zeit heute в Deutschland: 05: 00
Редактировать: Если нет способа избежать получения java.sql.Time
, сначала преобразуйте его в LocalTime
.Предполагая, что Time
в UTC, и мы не хотим полагаться на хрупкую настройку часового пояса JVM для преобразования, вы правы, что нам нужен метод getTime
:
Time sqlTimeInUtc = // Get from database
LocalTime timeInUtc
= LocalTime.MIDNIGHT.plus(sqlTimeInUtc.getTime(), ChronoUnit.MILLIS);
Если выможно полагаться на настройку часового пояса JVM, также являющуюся UTC, следующее будет лучше:
LocalTime timeInUtc = sqlTimeInUtc.toLocalTime();
В обоих случаях все остальное, как указано выше.
Во всех случаях есть некоторые угловые случаивокруг вопроса, хотите ли вы «сегодня в UTC» или «сегодня в часовом поясе Европы / Берлина», когда вы говорите «время должно быть указано на сегодня».Существует также угловой случай, если время между 2 и 3 часами утра, а сегодня последнее воскресенье марта, когда часы переведены с 2 на 3, чтобы начать летнее время (DST) в Германии.Пожалуйста, продумайте эти угловые случаи и решите, что вы хотите.
Кстати, ваш диагноз полностью верен: Time.getTime
возвращает время суток 1 января 1970 года, поэтому, когда вы вводите это в Instant
, вы конвертируете время суток в эту дату, то есть без летнего времени.