From a3642608b401383fe02d89731d383208afb91313 Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Mon, 27 Apr 2026 14:33:36 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20#48:=20Fehlerbehandlung=20f=C3=BCr=20Lega?= =?UTF-8?q?cy-Datumsformat=20in=20stringToInstant()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fehler: stringToInstant() in SqliteDocumentRecordRepositoryAdapter verwendete nur Instant.parse(), das nur ISO-8601 versteht. Ältere DB-Einträge haben aber das Format 'yyyy-MM-dd HH:mm:ss' (Leerzeichen statt T, kein Z). Lösung: Fallback-Logik implementiert 1. Versuch: Instant.parse() für ISO-8601 Format 2. Fallback: DateTimeFormatter für 'yyyy-MM-dd HH:mm:ss' → als UTC parsen Die Methode bleibt robust und gibt null zurück, wenn beide Parser fehlschlagen. Co-Authored-By: Claude Haiku 4.5 --- ...SqliteDocumentRecordRepositoryAdapter.java | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/sqlite/SqliteDocumentRecordRepositoryAdapter.java b/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/sqlite/SqliteDocumentRecordRepositoryAdapter.java index f5cbb90..9789247 100644 --- a/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/sqlite/SqliteDocumentRecordRepositoryAdapter.java +++ b/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/sqlite/SqliteDocumentRecordRepositoryAdapter.java @@ -6,6 +6,9 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.Objects; import org.apache.logging.log4j.LogManager; @@ -286,13 +289,37 @@ public class SqliteDocumentRecordRepositoryAdapter implements DocumentRecordRepo } /** - * Converts a string representation back to an Instant. + * Konvertiert eine String-Darstellung zurück zu einem Instant. + *

+ * Unterstützt zwei Datumsformate für Rückwärtskompatibilität: + *

* - * @param stringValue the ISO-8601 string representation, may be null - * @return the parsed Instant, or null if stringValue is null or blank + * @param stringValue die String-Darstellung des Datums, kann null sein + * @return das geparste Instant, oder null wenn stringValue null oder leer ist */ private Instant stringToInstant(String stringValue) { - return stringValue != null && !stringValue.isBlank() ? Instant.parse(stringValue) : null; + if (stringValue == null || stringValue.isBlank()) { + return null; + } + + // Versuch mit ISO-8601 Format (moderner Standard) + try { + return Instant.parse(stringValue); + } catch (Exception e) { + // Fallback auf älteres Format "yyyy-MM-dd HH:mm:ss" (als UTC) + try { + LocalDateTime dateTime = LocalDateTime.parse(stringValue, + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + return dateTime.atZone(ZoneId.of("UTC")).toInstant(); + } catch (Exception fallbackException) { + logger.warn("Fehler beim Parsen der Instant-String '{}' in beiden Formaten (ISO-8601 und Legacy-Format)", + stringValue, fallbackException); + return null; + } + } } /**