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 --- .../barcode/ticket/api/utils/DateTimeUtils.java | 251 +++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 src/org/uic/barcode/ticket/api/utils/DateTimeUtils.java (limited to 'src/org/uic/barcode/ticket/api/utils/DateTimeUtils.java') 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())); + } + +} -- cgit v1.2.3