From c0d9636e63156b39223f5cc342d04ea2ed480bd2 Mon Sep 17 00:00:00 2001 From: Vincent Paturet Date: Fri, 27 Feb 2026 15:09:20 +0100 Subject: [PATCH] Cache ZoneId and ZoneOffset in ZonedDateTimeAdapter ZoneId.systemDefault() internally calls TimeZone.getDefault() which clones the ZoneInfo object on every invocation. Since parse() is called for every datetime field in SIRI XML messages, this creates significant allocation pressure. Cache the default ZoneId and ZoneOffset as static final constants to eliminate this per-call overhead. --- .../java/org/entur/siri/adapter/ZonedDateTimeAdapter.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/entur/siri/adapter/ZonedDateTimeAdapter.java b/src/main/java/org/entur/siri/adapter/ZonedDateTimeAdapter.java index b4e2412..1aa1cd6 100644 --- a/src/main/java/org/entur/siri/adapter/ZonedDateTimeAdapter.java +++ b/src/main/java/org/entur/siri/adapter/ZonedDateTimeAdapter.java @@ -22,6 +22,9 @@ public class ZonedDateTimeAdapter { + private static final ZoneId DEFAULT_ZONE = ZoneId.systemDefault(); + private static final ZoneOffset ZERO_OFFSET = ZoneOffset.ofHours(0); + /** * Parses dateTime to ZonedDateTime with optional zone. * If Zone is not provided, local system default is used. @@ -35,10 +38,10 @@ public static ZonedDateTime parse(String dateTime) { parsed = ZonedDateTime.parse(dateTime); } catch (DateTimeParseException e) { LocalDateTime parse1 = LocalDateTime.parse(dateTime, DateTimeFormatter.ISO_LOCAL_DATE_TIME); - parsed = ZonedDateTime.ofLocal(parse1, ZoneId.systemDefault(), ZoneOffset.ofHours(0)); + parsed = ZonedDateTime.ofLocal(parse1, DEFAULT_ZONE, ZERO_OFFSET); } - return parsed.withZoneSameInstant(ZoneId.systemDefault()); + return parsed.withZoneSameInstant(DEFAULT_ZONE); } }