diff --git a/src/main/java/com/solab/iso8583/IsoType.java b/src/main/java/com/solab/iso8583/IsoType.java index 4fc8d18..5e3c4ea 100644 --- a/src/main/java/com/solab/iso8583/IsoType.java +++ b/src/main/java/com/solab/iso8583/IsoType.java @@ -64,7 +64,9 @@ public enum IsoType { /** variable length byte array with 4-digit header length. */ LLLLBIN(false, 0), /** Date in format yyMMddHHmmss. */ - DATE12(false,12); + DATE12(false,12), + /** Date in format yyMMdd */ + DATE6(false,6); private boolean needsLen; private int length; @@ -99,8 +101,10 @@ public enum IsoType { } else if (this == DATE12) { sdf = new SimpleDateFormat("yyMMddHHmmss"); } else if (this == DATE14) { - sdf = new SimpleDateFormat("YYYYMMddHHmmss"); - } else { + sdf = new SimpleDateFormat("YYYYMMddHHmmss"); + } else if (this == DATE6) { + sdf = new SimpleDateFormat("yyMMdd"); + } else { throw new IllegalArgumentException("Cannot format date as " + this); } if (tz != null) { diff --git a/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java index cad85a6..23f6bfa 100644 --- a/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java @@ -97,11 +97,7 @@ public class Date10ParseInfo extends DateTimeParseInfo { 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); + return createValue(cal, true); } } diff --git a/src/main/java/com/solab/iso8583/parse/Date12ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date12ParseInfo.java index 8a39354..fc05124 100644 --- a/src/main/java/com/solab/iso8583/parse/Date12ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date12ParseInfo.java @@ -94,11 +94,7 @@ public class Date12ParseInfo extends DateTimeParseInfo { cal.set(Calendar.MINUTE, tens[4]); cal.set(Calendar.SECOND, tens[5]); cal.set(Calendar.MILLISECOND,0); - if (tz != null) { - cal.setTimeZone(tz); - } - adjustWithFutureTolerance(cal); - return new IsoValue<>(type, cal.getTime(), null); + return createValue(cal, true); } } diff --git a/src/main/java/com/solab/iso8583/parse/Date14ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date14ParseInfo.java index 18692ff..7334a70 100644 --- a/src/main/java/com/solab/iso8583/parse/Date14ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date14ParseInfo.java @@ -84,11 +84,7 @@ public class Date14ParseInfo extends DateTimeParseInfo { cal.set(Calendar.MINUTE, tens[5]); cal.set(Calendar.SECOND, tens[6]); cal.set(Calendar.MILLISECOND,0); - if (tz != null) { - cal.setTimeZone(tz); - } - adjustWithFutureTolerance(cal); - return new IsoValue<>(type, cal.getTime(), null); + return createValue(cal, true); } } diff --git a/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java index 2d25203..4d44cfc 100644 --- a/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java @@ -86,11 +86,7 @@ public class Date4ParseInfo extends DateTimeParseInfo { cal.set(Calendar.MONTH, tens[0] - 1); cal.set(Calendar.DATE, tens[1]); cal.set(Calendar.MILLISECOND,0); - if (tz != null) { - cal.setTimeZone(tz); - } - DateTimeParseInfo.adjustWithFutureTolerance(cal); - return new IsoValue<>(type, cal.getTime(), null); + return createValue(cal, true); } } diff --git a/src/main/java/com/solab/iso8583/parse/Date6ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date6ParseInfo.java new file mode 100644 index 0000000..0fcbba4 --- /dev/null +++ b/src/main/java/com/solab/iso8583/parse/Date6ParseInfo.java @@ -0,0 +1,93 @@ +package com.solab.iso8583.parse; + +import com.solab.iso8583.CustomField; +import com.solab.iso8583.IsoType; +import com.solab.iso8583.IsoValue; + +import java.io.UnsupportedEncodingException; +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; + +/** + * Parser for fields of type DATE6. + * + * @author Enrique Zamudio + * Date: 4/17/18 12:41 PM + */ +public class Date6ParseInfo extends DateTimeParseInfo { + + public Date6ParseInfo() { + super(IsoType.DATE6, 6); + } + + @Override + public IsoValue parse(int field, byte[] buf, int pos, CustomField custom) throws ParseException, UnsupportedEncodingException { + if (pos < 0) { + throw new ParseException(String.format("Invalid DATE6 field %d position %d", + field, pos), pos); + } + if (pos+6 > buf.length) { + throw new ParseException(String.format( + "Insufficient data for DATE6 field %d, pos %d", field, pos), pos); + } + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + //Set the month in the date + int year; + if (forceStringDecoding) { + year = Integer.parseInt(new String(buf, pos, 2, getCharacterEncoding()), 10); + cal.set(Calendar.MONTH, Integer.parseInt(new String(buf, pos+2, 2, getCharacterEncoding()), 10)-1); + cal.set(Calendar.DATE, Integer.parseInt(new String(buf, pos+4, 2, getCharacterEncoding()), 10)); + } else { + year = ((buf[pos] - 48) * 10) + buf[pos + 1] - 48; + cal.set(Calendar.MONTH, ((buf[pos + 2] - 48) * 10) + buf[pos + 3] - 49); + cal.set(Calendar.DATE, ((buf[pos + 4] - 48) * 10) + buf[pos + 5] - 48); + } + if (year > 50) { + cal.set(Calendar.YEAR, 1900+year); + } else { + cal.set(Calendar.YEAR, 2000+year); + } + return createValue(cal, false); + } + + @Override + public IsoValue parseBinary(int field, byte[] buf, int pos, CustomField custom) throws ParseException, UnsupportedEncodingException { + if (pos < 0) { + throw new ParseException(String.format("Invalid DATE6 field %d position %d", + field, pos), pos); + } + if (pos+3 > buf.length) { + throw new ParseException(String.format("Insufficient data for DATE6 field %d, pos %d", + field, pos), pos); + } + int[] tens = new int[3]; + int start = 0; + for (int i = pos; i < pos + tens.length; i++) { + tens[start++] = (((buf[i] & 0xf0) >> 4) * 10) + (buf[i] & 0x0f); + } + Calendar cal = Calendar.getInstance(); + //A SimpleDateFormat in the case of dates won't help because of the missing data + //we have to use the current date for reference and change what comes in the buffer + //Set the month in the date + if (tens[0] > 50) { + cal.set(Calendar.YEAR, 1900+tens[0]); + } else { + cal.set(Calendar.YEAR, 2000+tens[0]); + } + cal.set(Calendar.MONTH, tens[1] - 1); + cal.set(Calendar.DATE, tens[2]); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND,0); + if (tz != null) { + cal.setTimeZone(tz); + } + return createValue(cal, true); + } +} diff --git a/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java b/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java index f6de515..c49ee81 100644 --- a/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java @@ -93,9 +93,6 @@ public class DateExpParseInfo extends DateTimeParseInfo { 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); + return createValue(cal, false); } }