Use timezone if available when parsing time/date fields #21

This commit is contained in:
Enrique Zamudio
2013-12-18 18:39:55 -06:00
parent 29a9411b9c
commit 61b90d4489
4 changed files with 29 additions and 19 deletions
@@ -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<Date>(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<Date>(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);
}
}
}
@@ -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<Date>(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<Date>(type, cal.getTime(), null);
}
@@ -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<Date>(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<Date>(type, cal.getTime(), null);
}
}
@@ -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<Date>(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<Date>(type, cal.getTime(), null);
}