Skip to content

Commit

Permalink
PW-1875: Zulu time zone conversion for BAH v1 (#117)
Browse files Browse the repository at this point in the history
Co-authored-by: fernando.desarriera <[email protected]>
  • Loading branch information
zubri and fernando-prowide committed Jun 1, 2024
1 parent bbf0d36 commit 7cc0e59
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 6 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"));
}
}

0 comments on commit 7cc0e59

Please sign in to comment.