Browse Source
With older versions H2 returned a proprietary instance of `TimestampWithTimeZone` from `ResultSet.getObject()`. We used to support the conversion of that to an `OffsetDateTime`. With the most recent versions `TimestampWithTimeZone` is no longer part of the H2 driver, and we only register the converter when we encounter older versions of H2. Closes #1114 See https://github.com/h2database/h2database/pull/13592.3.x
3 changed files with 78 additions and 33 deletions
@ -0,0 +1,63 @@
@@ -0,0 +1,63 @@
|
||||
/* |
||||
* Copyright 2021 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.data.jdbc.core.dialect; |
||||
|
||||
import java.time.OffsetDateTime; |
||||
import java.time.ZoneOffset; |
||||
|
||||
import org.h2.api.TimestampWithTimeZone; |
||||
import org.springframework.core.convert.converter.Converter; |
||||
import org.springframework.data.convert.ReadingConverter; |
||||
|
||||
/** |
||||
* Converter converting from an H2 internal representation of a timestamp with time zone to an OffsetDateTime. |
||||
* |
||||
* Only required for H2 versions < 2.0 |
||||
* |
||||
* @author Jens Schauder |
||||
* @since 2.7 |
||||
*/ |
||||
@ReadingConverter |
||||
public enum H2TimestampWithTimeZoneToOffsetDateTimeConverter |
||||
implements Converter<TimestampWithTimeZone, OffsetDateTime> { |
||||
|
||||
INSTANCE; |
||||
|
||||
@Override |
||||
public OffsetDateTime convert(TimestampWithTimeZone source) { |
||||
|
||||
long nanosInSecond = 1_000_000_000; |
||||
long nanosInMinute = nanosInSecond * 60; |
||||
long nanosInHour = nanosInMinute * 60; |
||||
|
||||
long hours = (source.getNanosSinceMidnight() / nanosInHour); |
||||
|
||||
long nanosInHours = hours * nanosInHour; |
||||
long nanosLeft = source.getNanosSinceMidnight() - nanosInHours; |
||||
long minutes = nanosLeft / nanosInMinute; |
||||
|
||||
long nanosInMinutes = minutes * nanosInMinute; |
||||
nanosLeft -= nanosInMinutes; |
||||
long seconds = nanosLeft / nanosInSecond; |
||||
|
||||
long nanosInSeconds = seconds * nanosInSecond; |
||||
nanosLeft -= nanosInSeconds; |
||||
ZoneOffset offset = ZoneOffset.ofTotalSeconds(source.getTimeZoneOffsetSeconds()); |
||||
|
||||
return OffsetDateTime.of(source.getYear(), source.getMonth(), source.getDay(), (int) hours, (int) minutes, |
||||
(int) seconds, (int) nanosLeft, offset); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue