From 26ca7242605261c3bf1c27fb427ece203504ee51 Mon Sep 17 00:00:00 2001 From: CGantert345 <57003061+CGantert345@users.noreply.github.com> Date: Fri, 19 Mar 2021 15:51:40 +0100 Subject: time-zone-fix --- .../ticket/api/utils/Api2OpenAsnEncoder.java | 14 +- .../ticket/api/utils/Api2OpenAsnEncoderV2.java | 16 +- .../barcode/ticket/api/utils/DateTimeUtils.java | 251 +++++++++++++++++++++ .../ticket/api/utils/OpenAsn2ApiDecoder.java | 15 +- .../ticket/api/utils/OpenAsn2ApiDecoderV2.java | 7 +- 5 files changed, 271 insertions(+), 32 deletions(-) create mode 100644 src/org/uic/barcode/ticket/api/utils/DateTimeUtils.java (limited to 'src/org/uic/barcode/ticket/api/utils') diff --git a/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoder.java b/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoder.java index 78deb8a..5bc419c 100644 --- a/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoder.java +++ b/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoder.java @@ -881,7 +881,7 @@ public class Api2OpenAsnEncoder { asnData.setTariffs(encodeTariffCollection(document.getTariffs())); - asnData.setActivatedDays(document.getActivatedDays(),document.getValidFrom()); + asnData.addActivatedDays(DateTimeUtils.getActivatedDays(document.getValidFrom(), document.getActivatedDays())); if (document.getClassCode() != ITravelClassType.second){ asnData.setClassCode(convertTravelClass(document.getClassCode())); @@ -1558,13 +1558,7 @@ public class Api2OpenAsnEncoder { } - if(document.getActivatedDays()!= null && document.getActivatedDays().size() > 0) { - if (document.getValidFrom() != null) { - asnData.setActivatedDays(document.getActivatedDays(),document.getValidFrom()); - } else { - asnData.setActivatedDays(document.getActivatedDays(),issuingDate); - } - } + asnData.addActivatedDays(DateTimeUtils.getActivatedDays(document.getValidFrom(), document.getActivatedDays())); asnData.setClassCode(convertTravelClass(document.getClassCode())); @@ -1697,9 +1691,7 @@ public class Api2OpenAsnEncoder { asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate); - if(document.getActivatedDays()!= null && document.getActivatedDays().size() > 0) { - asnData.setActivatedDays(document.getActivatedDays(), document.getValidFrom()); - } + asnData.addActivatedDays(DateTimeUtils.getActivatedDays(document.getValidFrom(), document.getActivatedDays())); asnData.setExtension(encodeExtension(document.getExtension())); diff --git a/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoderV2.java b/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoderV2.java index 97abcfa..48583b9 100644 --- a/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoderV2.java +++ b/src/org/uic/barcode/ticket/api/utils/Api2OpenAsnEncoderV2.java @@ -886,7 +886,7 @@ public class Api2OpenAsnEncoderV2 { asnData.setTariffs(encodeTariffCollection(document.getTariffs())); - asnData.setActivatedDays(document.getActivatedDays(),document.getValidFrom()); + asnData.addActivatedDays(DateTimeUtils.getActivatedDays(document.getValidFrom(), document.getActivatedDays())); if (document.getClassCode() != ITravelClassType.second && document.getClassCode() != null){ asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name())); @@ -1562,14 +1562,8 @@ public class Api2OpenAsnEncoderV2 { } } - - if(document.getActivatedDays()!= null && document.getActivatedDays().size() > 0) { - if (document.getValidFrom() != null) { - asnData.setActivatedDays(document.getActivatedDays(),document.getValidFrom()); - } else { - asnData.setActivatedDays(document.getActivatedDays(),issuingDate); - } - } + asnData.addActivatedDays(DateTimeUtils.getActivatedDays(document.getValidFrom(), document.getActivatedDays())); + if (document.getClassCode() != null) { asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name())); } @@ -1703,9 +1697,7 @@ public class Api2OpenAsnEncoderV2 { asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate); - if(document.getActivatedDays()!= null && document.getActivatedDays().size() > 0) { - asnData.setActivatedDays(document.getActivatedDays(), document.getValidFrom()); - } + asnData.addActivatedDays(DateTimeUtils.getActivatedDays(document.getValidFrom(), document.getActivatedDays())); asnData.setExtension(encodeExtension(document.getExtension())); diff --git a/src/org/uic/barcode/ticket/api/utils/DateTimeUtils.java b/src/org/uic/barcode/ticket/api/utils/DateTimeUtils.java new file mode 100644 index 0000000..a0283c7 --- /dev/null +++ b/src/org/uic/barcode/ticket/api/utils/DateTimeUtils.java @@ -0,0 +1,251 @@ +package org.uic.barcode.ticket.api.utils; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +public class DateTimeUtils { + + public static Long getDateDifference(Date issuingDate, Date localDate) { + + if (issuingDate == null || localDate == null) return null; + + Calendar startCal = Calendar.getInstance(); + startCal.clear(); + startCal.setTime(issuingDate); + startCal.setTimeZone(TimeZone.getTimeZone("UTC")); + startCal.set(Calendar.HOUR_OF_DAY, 0); + startCal.set(Calendar.MINUTE, 0); + startCal.set(Calendar.SECOND, 0); + startCal.set(Calendar.MILLISECOND, 0); + Date start = startCal.getTime(); + + Calendar endCal = Calendar.getInstance(); + endCal.clear(); + endCal.setTime(localDate); + endCal.setTimeZone(TimeZone.getTimeZone("UTC")); + endCal.set(Calendar.HOUR_OF_DAY, 0); + endCal.set(Calendar.MINUTE, 0); + endCal.set(Calendar.SECOND, 0); + endCal.set(Calendar.MILLISECOND, 0); + Date end = endCal.getTime(); + + long diff = TimeUnit.DAYS.convert(end.getTime() - start.getTime(), TimeUnit.MILLISECONDS ); + //long diff = localDate.getTime() - issuingDate.getTime(); + //long dayDiff = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); + + return new Long(diff); + + } + + public static Long getDateDifferenceLocal(Date referenceDate, Date localDate) { + + if (referenceDate == null || localDate == null) return null; + + Calendar issuingCal = Calendar.getInstance(); + issuingCal.clear(); + issuingCal.setTime(referenceDate); + issuingCal.set(Calendar.HOUR_OF_DAY, 0); + issuingCal.set(Calendar.MINUTE, 0); + issuingCal.set(Calendar.SECOND, 0); + issuingCal.set(Calendar.MILLISECOND, 0); + + Calendar fromCal = Calendar.getInstance(); + fromCal.clear(); + fromCal.setTime(localDate); + fromCal.set(Calendar.HOUR_OF_DAY, 0); + fromCal.set(Calendar.MINUTE, 0); + fromCal.set(Calendar.SECOND, 0); + fromCal.set(Calendar.MILLISECOND, 0); + + long diff = localDate.getTime() - referenceDate.getTime(); + long dayDiff = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); + + return new Long(dayDiff); + + } + + public static Date getLocalDateFromDifference(Date issuingDate, int diff , Long time ) { + + if (issuingDate == null) return null; + + Calendar cal = Calendar.getInstance(); + cal.clear(); + cal.setTime(issuingDate); + cal.add(Calendar.DAY_OF_YEAR, diff); + + if (time != null) { + int hours = time.intValue() / 60; + int minutes = time.intValue() - hours * 60; + cal.set(Calendar.HOUR_OF_DAY, hours); + cal.set(Calendar.MINUTE,minutes); + } + + return cal.getTime(); + + } + + + public static void setTime(Calendar cal, Long time){ + + if (time != null) { + int hours = time.intValue() / 60; + int minutes = time.intValue() - hours * 60; + cal.set(Calendar.HOUR_OF_DAY, hours); + cal.set(Calendar.MINUTE,minutes); + } + + + } + + public static Long getTime (Calendar cal) { + + if (cal == null || + !cal.isSet(Calendar.HOUR_OF_DAY) || + !cal.isSet(Calendar.MINUTE) ) { + return null; + } + + int time = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE); + if (time > 0) { + return new Long (time ); + } + return null; + } + + public static Long getTime (Date date) { + + Calendar cal = Calendar.getInstance(); + cal.clear(); + cal.setTime(date); + + if (cal == null || + !cal.isSet(Calendar.HOUR_OF_DAY) || + !cal.isSet(Calendar.MINUTE) ) { + return null; + } + + int time = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE); + if (time > 0) { + return new Long (time ); + } + return null; + } + + public static Date getDate(Date issuingDate, Long date, Long time){ + + if (issuingDate == null) return null; + + if (date == null) { + date = 0L; + } + + Calendar issuingCal = Calendar.getInstance(); + issuingCal.clear(); + issuingCal.setTime(issuingDate); + + Calendar cal = Calendar.getInstance(); + cal.clear(); + cal.set(Calendar.YEAR,issuingCal.get(Calendar.YEAR) ); + cal.set(Calendar.DAY_OF_YEAR,issuingCal.get(Calendar.DAY_OF_YEAR) ); + + cal.add(Calendar.DAY_OF_YEAR, date.intValue()); + + if (time == null) { + DateTimeUtils.setTime(cal,0L); + } else { + DateTimeUtils.setTime(cal,time); + } + return cal.getTime(); + + } + + + /** + * Gets the UTC offset. + * + * @param date and time of the issuing date + * @param date and time of the departure + * @return the UTC offset in multiples of 15 minutes + * the offset needs to be added to local time to get the UTC time (UTC = local + offset) + */ + public static Long getUTCoffset(Date local) { + + + Calendar cal = Calendar.getInstance(); + cal.clear(); + cal.setTime(local); + + /* + * Returns the amount of time in milliseconds to add to UTC to get standard time in this + * time zone. Because this value is not affected by daylight saving time, it is called raw offset. + * If an underlying TimeZone implementation subclass supports historical GMT offset changes, the method + * returns the raw offset value of the current date. In Honolulu, for example, its raw offset + * changed from GMT-10:30 to GMT-10:00 in 1947, and this method + * always returns -36000000 milliseconds (i.e., -10 hours). + */ + int minuteOffset = - cal.getTimeZone().getRawOffset()/ ( 1000 * 60 * 15 ); + + return new Long (minuteOffset); + + } + + public static Date getUTCDate(Date issuingDate, Long date, Long time, Long UTCOffset) { + + if (issuingDate == null) return null; + + if (UTCOffset == null) return null; + + if (time == null) return null; + + if (date == null) { + date = 0L; + } + + Calendar issuingCal = Calendar.getInstance(); + issuingCal.clear(); + issuingCal.setTime(issuingDate); + + Calendar cal = Calendar.getInstance(); + cal.clear(); + cal.set(Calendar.YEAR,issuingCal.get(Calendar.YEAR) ); + cal.set(Calendar.DAY_OF_YEAR,issuingCal.get(Calendar.DAY_OF_YEAR) ); + cal.add(Calendar.DAY_OF_YEAR, date.intValue()); + + int hours = time.intValue() / 60; + int minutes = time.intValue() - hours * 60; + cal.set(Calendar.HOUR_OF_DAY, hours); + cal.set(Calendar.MINUTE,minutes); + + cal.add(Calendar.MINUTE, (int) (UTCOffset * 15) ); + + cal.setTimeZone(TimeZone.getTimeZone("UTC")); + + return cal.getTime(); + + } + + + public static Collection getActivatedDays(Date referenceDate, Collection days) { + + ArrayList lDays = new ArrayList(); + + if (referenceDate == null) return lDays; + + for (Date day : days) { + long dateDiff2 = DateTimeUtils.getDateDifference(referenceDate,day); + lDays.add(dateDiff2); + } + + return lDays; + + } + + public static Date dateToUTC(Date date){ + return new Date(date.getTime() - Calendar.getInstance().getTimeZone().getOffset(date.getTime())); + } + +} diff --git a/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoder.java b/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoder.java index 46f201d..46d2c1b 100644 --- a/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoder.java +++ b/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoder.java @@ -189,7 +189,12 @@ public class OpenAsn2ApiDecoder { } if (asnUicRailTicketData.getTransportDocument() != null && !asnUicRailTicketData.getTransportDocument().isEmpty()) { - populateTravelDocuments(asnUicRailTicketData.getTransportDocument(),uicRailTicket,uicRailTicket.getIssuerDetails().getIssuingDate() ); + + // date is already converted to local time, use UTC for internal calculations + Date localIssuingDate = uicRailTicket.getIssuerDetails().getIssuingDate(); + Date issuingDate = DateTimeUtils.dateToUTC(localIssuingDate); + + populateTravelDocuments(asnUicRailTicketData.getTransportDocument(),uicRailTicket, issuingDate); } @@ -1627,13 +1632,7 @@ public class OpenAsn2ApiDecoder { document.setValidUntil(asnDocument.getValidUntilDate(issuingDate)); document.setValidUntilUTCoffset(asnDocument.getValidUntilUTCOffset()); - if (asnDocument.getActivatedDay()!=null && !asnDocument.getActivatedDay().isEmpty()) { - if (document.getValidFrom() != null) { - document.getActivatedDays().addAll(asnDocument.getActivatedDays(document.getValidFrom())); - } else { - document.getActivatedDays().addAll(asnDocument.getActivatedDays(issuingDate)); - } - } + document.getActivatedDays().addAll(asnDocument.getActivatedDays(issuingDate)); document.setExtension(convertExtension(asnDocument.getExtension())); document.setInfoText(asnDocument.getInfoText()); diff --git a/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoderV2.java b/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoderV2.java index 4aca9eb..c6eac0e 100644 --- a/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoderV2.java +++ b/src/org/uic/barcode/ticket/api/utils/OpenAsn2ApiDecoderV2.java @@ -191,7 +191,12 @@ public class OpenAsn2ApiDecoderV2 { } if (asnUicRailTicketData.getTransportDocument() != null && !asnUicRailTicketData.getTransportDocument().isEmpty()) { - populateTravelDocuments(asnUicRailTicketData.getTransportDocument(),uicRailTicket,uicRailTicket.getIssuerDetails().getIssuingDate() ); + + // date is already converted to local time, use UTC for internal calculations + Date localIssuingDate = uicRailTicket.getIssuerDetails().getIssuingDate(); + Date issuingDate = DateTimeUtils.dateToUTC(localIssuingDate); + + populateTravelDocuments(asnUicRailTicketData.getTransportDocument(),uicRailTicket, issuingDate); } -- cgit v1.2.3