From e7e8c48c5cc6249d22f8e20c75e30dd4be03cd37 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sun, 6 Apr 2025 23:26:19 +0200 Subject: [PATCH] [FEAT] add OffsetDateTime in the BDD interface with UTC force --- .../kar/archidata/dataAccess/DBAccessSQL.java | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/org/kar/archidata/dataAccess/DBAccessSQL.java b/src/org/kar/archidata/dataAccess/DBAccessSQL.java index fe6971e..01bd33e 100644 --- a/src/org/kar/archidata/dataAccess/DBAccessSQL.java +++ b/src/org/kar/archidata/dataAccess/DBAccessSQL.java @@ -14,6 +14,9 @@ import java.sql.Types; import java.time.Instant; import java.time.LocalDate; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -370,7 +373,18 @@ public class DBAccessSQL extends DBAccess { if (tmp == null) { ps.setNull(iii.value, Types.INTEGER); } else { - final Timestamp sqlDate = java.sql.Timestamp.from(((Date) tmp).toInstant()); + final OffsetDateTime offsetDateTime = ((Date) tmp).toInstant().atZone(ZoneId.systemDefault()) + .toOffsetDateTime(); + final Timestamp sqlDate = java.sql.Timestamp + .from(offsetDateTime.withOffsetSameInstant(ZoneOffset.UTC).toInstant()); + ps.setTimestamp(iii.value, sqlDate); + } + } else if (type == OffsetDateTime.class) { + if (tmp == null) { + ps.setNull(iii.value, Types.INTEGER); + } else { + final Timestamp sqlDate = java.sql.Timestamp + .from(((OffsetDateTime) tmp).withOffsetSameInstant(ZoneOffset.UTC).toInstant()); ps.setTimestamp(iii.value, sqlDate); } } else if (type == Instant.class) { @@ -522,7 +536,9 @@ public class DBAccessSQL extends DBAccess { if (rs.wasNull()) { field.set(data, null); } else { - field.set(data, Date.from(tmp.toInstant())); + final OffsetDateTime odt = tmp.toInstant().atOffset(ZoneOffset.UTC); + odt.atZoneSameInstant(ZoneId.systemDefault()); + field.set(data, Date.from(odt.toInstant())); countNotNull.inc(); } } catch (final SQLException ex) { @@ -537,6 +553,28 @@ public class DBAccessSQL extends DBAccess { countNotNull.inc(); } } + } else if (type == OffsetDateTime.class) { + try { + final Timestamp tmp = rs.getTimestamp(count.value); + if (rs.wasNull()) { + field.set(data, null); + } else { + final OffsetDateTime odt = tmp.toInstant().atOffset(ZoneOffset.UTC); + field.set(data, odt); + countNotNull.inc(); + } + } catch (final SQLException ex) { + final String tmp = rs.getString(count.value); + LOGGER.error("Fail to parse the SQL time !!! {}", tmp); + if (rs.wasNull()) { + field.set(data, null); + } else { + final OffsetDateTime date = DateTools.parseOffsetDateTime(tmp); + LOGGER.error("Fail to parse the SQL time !!! {}", date); + field.set(data, date); + countNotNull.inc(); + } + } } else if (type == Instant.class) { final String tmp = rs.getString(count.value); if (rs.wasNull()) {