From 7cc0e5923471ddfae6c13da801187c517e94bb33 Mon Sep 17 00:00:00 2001 From: Sebastian Zubrinic Date: Fri, 31 May 2024 21:19:11 -0300 Subject: [PATCH] PW-1875: Zulu time zone conversion for BAH v1 (#117) Co-authored-by: fernando.desarriera --- CHANGELOG.md | 3 +++ .../mx/adapters/ZuluDateTimeAdapter.java | 19 +++++++++++++++++-- .../mx/adapters/ZuluDateTimeAdapterTest.java | 8 ++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89516dfe9..19712d237 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Prowide ISO 20022 - CHANGELOG +#### 9.4.6 - May 2024 + * (PW-1875) Fixed the `ZuluDateTimeAdapter` to convert the datetime to UTC offset if needed + #### 9.4.5 - May 2024 * (PW-1875) Changed the BusinessApplicationHeaderV01 marshaller to always use Zulu timezone with "Z" indicator diff --git a/iso20022-core/src/main/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapter.java b/iso20022-core/src/main/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapter.java index b4906d274..384107c75 100644 --- a/iso20022-core/src/main/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapter.java +++ b/iso20022-core/src/main/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapter.java @@ -16,7 +16,11 @@ package com.prowidesoftware.swift.model.mx.adapters; import java.text.SimpleDateFormat; +import java.util.GregorianCalendar; +import java.util.TimeZone; import javax.xml.bind.annotation.adapters.XmlAdapter; +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; /** @@ -93,10 +97,21 @@ public String marshal(XMLGregorianCalendar cal) throws Exception { } else { String formatted; synchronized (marshalFormat) { - // Viene un calendar no UTC? - formatted = AdapterUtils.format(this.marshalFormat, cal); + // Create a new Calendar with the Date represented in Zulu Time + XMLGregorianCalendar xmlGregorianCalendarZulu = getXmlGregorianCalendarInZulu(cal); + formatted = AdapterUtils.format(this.marshalFormat, xmlGregorianCalendarZulu); } return formatted.replace(".000", ""); } } + + private static XMLGregorianCalendar getXmlGregorianCalendarInZulu(XMLGregorianCalendar cal) + throws DatatypeConfigurationException { + DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); + XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(); + GregorianCalendar gregorianCalendar = xmlGregorianCalendar.toGregorianCalendar(); + gregorianCalendar.setTime(cal.toGregorianCalendar().getTime()); + gregorianCalendar.setTimeZone(TimeZone.getTimeZone("Z")); + return datatypeFactory.newXMLGregorianCalendar(gregorianCalendar); + } } diff --git a/iso20022-core/src/test/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapterTest.java b/iso20022-core/src/test/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapterTest.java index 3566b838f..9ad132b4b 100644 --- a/iso20022-core/src/test/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapterTest.java +++ b/iso20022-core/src/test/java/com/prowidesoftware/swift/model/mx/adapters/ZuluDateTimeAdapterTest.java @@ -71,14 +71,14 @@ public void testUnmarshallNoOffset() throws Exception { public void testMarshallFractionOfSeconds() throws Exception { XMLGregorianCalendar cal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(BigInteger.valueOf(2022), 3, 4, 12, 50, 8, new BigDecimal("0.123"), -180); - assertEquals("2022-03-04T12:50:08.123Z", adapter.marshal(cal)); + assertEquals("2022-03-04T15:50:08.123Z", adapter.marshal(cal)); } @Test public void testMarshallNoFractionOfSeconds() throws Exception { XMLGregorianCalendar cal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(BigInteger.valueOf(2022), 3, 4, 12, 50, 8, null, -180); - assertEquals("2022-03-04T12:50:08Z", adapter.marshal(cal)); + assertEquals("2022-03-04T15:50:08Z", adapter.marshal(cal)); } @Test @@ -154,7 +154,7 @@ public void test_marshall_message_with_BAH1_and_CreDt_OffsetDateTime() { // Create a new instance of MxPacs00800110 with AppHdr CreDtTm ZuluDateTime MxPacs00800110 mxPacs00800110 = MxPacs00800110.parse(xml); - // After CreDtTm is parsed, it should be 2024-03-27T20:45:56Z - assertTrue(mxPacs00800110.message().contains("2024-03-27T20:45:56Z")); + // After CreDtTm is parsed, it should be in UTC offset and formatted with Zulu indicator + assertTrue(mxPacs00800110.message().contains("2024-03-27T23:45:56Z")); } }