From 61b90d44894f67b4619ecb9203bd0d2e1d573950 Mon Sep 17 00:00:00 2001 From: Enrique Zamudio Date: Wed, 18 Dec 2013 18:39:55 -0600 Subject: [PATCH] Use timezone if available when parsing time/date fields #21 --- .../solab/iso8583/parse/Date10ParseInfo.java | 22 ++++++------------- .../solab/iso8583/parse/Date4ParseInfo.java | 10 +++++++-- .../solab/iso8583/parse/DateExpParseInfo.java | 8 ++++++- .../solab/iso8583/parse/TimeParseInfo.java | 8 ++++++- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java index 897a4d3..ebbca48 100644 --- a/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java @@ -31,13 +31,8 @@ import com.solab.iso8583.IsoValue; * * @author Enrique Zamudio */ -public class Date10ParseInfo extends FieldParseInfo { +public class Date10ParseInfo extends DateTimeParseInfo { - private static final long FUTURE_TOLERANCE; - - static { - FUTURE_TOLERANCE = Long.parseLong(System.getProperty("j8583.future.tolerance", "900000")); - } public Date10ParseInfo() { super(IsoType.DATE10, 10); } @@ -72,6 +67,9 @@ public class Date10ParseInfo extends FieldParseInfo { cal.set(Calendar.SECOND, ((buf[pos + 8] - 48) * 10) + buf[pos + 9] - 48); } cal.set(Calendar.MILLISECOND,0); + if (tz != null) { + cal.setTimeZone(tz); + } adjustWithFutureTolerance(cal); return new IsoValue(type, cal.getTime(), null); } @@ -103,17 +101,11 @@ public class Date10ParseInfo extends FieldParseInfo { cal.set(Calendar.MINUTE, tens[3]); cal.set(Calendar.SECOND, tens[4]); cal.set(Calendar.MILLISECOND,0); + if (tz != null) { + cal.setTimeZone(tz); + } adjustWithFutureTolerance(cal); return new IsoValue(type, cal.getTime(), null); } - public static void adjustWithFutureTolerance(Calendar cal) { - //We need to handle a small tolerance into the future (a couple of minutes) - long now = System.currentTimeMillis(); - long then = cal.getTimeInMillis(); - if (then > now && then-now > FUTURE_TOLERANCE) { - cal.add(Calendar.YEAR, -1); - } - } - } diff --git a/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java index d7ac44c..35cf58c 100644 --- a/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java @@ -31,7 +31,7 @@ import com.solab.iso8583.IsoValue; * * @author Enrique Zamudio */ -public class Date4ParseInfo extends FieldParseInfo { +public class Date4ParseInfo extends DateTimeParseInfo { public Date4ParseInfo() { super(IsoType.DATE4, 4); @@ -61,6 +61,9 @@ public class Date4ParseInfo extends FieldParseInfo { } else { cal.set(Calendar.MONTH, ((buf[pos] - 48) * 10) + buf[pos + 1] - 49); cal.set(Calendar.DATE, ((buf[pos + 2] - 48) * 10) + buf[pos + 3] - 48); + } + if (tz != null) { + cal.setTimeZone(tz); } Date10ParseInfo.adjustWithFutureTolerance(cal); return new IsoValue(type, cal.getTime(), null); @@ -87,7 +90,10 @@ public class Date4ParseInfo extends FieldParseInfo { cal.set(Calendar.MONTH, tens[0] - 1); cal.set(Calendar.DATE, tens[1]); cal.set(Calendar.MILLISECOND,0); - Date10ParseInfo.adjustWithFutureTolerance(cal); + if (tz != null) { + cal.setTimeZone(tz); + } + DateTimeParseInfo.adjustWithFutureTolerance(cal); return new IsoValue(type, cal.getTime(), null); } diff --git a/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java b/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java index bedd01b..e3be670 100644 --- a/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java @@ -31,7 +31,7 @@ import com.solab.iso8583.IsoValue; * * @author Enrique Zamudio */ -public class DateExpParseInfo extends FieldParseInfo { +public class DateExpParseInfo extends DateTimeParseInfo { public DateExpParseInfo() { super(IsoType.DATE_EXP, 4); @@ -63,6 +63,9 @@ public class DateExpParseInfo extends FieldParseInfo { cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) - (cal.get(Calendar.YEAR) % 100) + ((buf[pos] - 48) * 10) + buf[pos + 1] - 48); cal.set(Calendar.MONTH, ((buf[pos + 2] - 48) * 10) + buf[pos + 3] - 49); + } + if (tz != null) { + cal.setTimeZone(tz); } return new IsoValue(type, cal.getTime(), null); } @@ -93,6 +96,9 @@ public class DateExpParseInfo extends FieldParseInfo { cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) - (cal.get(Calendar.YEAR) % 100) + tens[0]); cal.set(Calendar.MONTH, tens[1] - 1); + if (tz != null) { + cal.setTimeZone(tz); + } return new IsoValue(type, cal.getTime(), null); } } diff --git a/src/main/java/com/solab/iso8583/parse/TimeParseInfo.java b/src/main/java/com/solab/iso8583/parse/TimeParseInfo.java index 9af3ad6..d48885b 100644 --- a/src/main/java/com/solab/iso8583/parse/TimeParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/TimeParseInfo.java @@ -31,7 +31,7 @@ import com.solab.iso8583.IsoValue; * * @author Enrique Zamudio */ -public class TimeParseInfo extends FieldParseInfo { +public class TimeParseInfo extends DateTimeParseInfo { public TimeParseInfo() { @@ -58,6 +58,9 @@ public class TimeParseInfo extends FieldParseInfo { cal.set(Calendar.HOUR_OF_DAY, ((buf[pos] - 48) * 10) + buf[pos + 1] - 48); cal.set(Calendar.MINUTE, ((buf[pos + 2] - 48) * 10) + buf[pos + 3] - 48); cal.set(Calendar.SECOND, ((buf[pos + 4] - 48) * 10) + buf[pos + 5] - 48); + } + if (tz != null) { + cal.setTimeZone(tz); } return new IsoValue(type, cal.getTime(), null); } @@ -82,6 +85,9 @@ public class TimeParseInfo extends FieldParseInfo { cal.set(Calendar.HOUR_OF_DAY, tens[0]); cal.set(Calendar.MINUTE, tens[1]); cal.set(Calendar.SECOND, tens[2]); + if (tz != null) { + cal.setTimeZone(tz); + } return new IsoValue(type, cal.getTime(), null); }