diff --git a/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java index 7118dc0..897a4d3 100644 --- a/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date10ParseInfo.java @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package com.solab.iso8583.parse; +import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.util.Calendar; import java.util.Date; @@ -44,7 +45,7 @@ public class Date10ParseInfo extends FieldParseInfo { @Override public IsoValue parse(final int field, final byte[] buf, final int pos, final CustomField custom) - throws ParseException { + throws ParseException, UnsupportedEncodingException { if (pos < 0) { throw new ParseException(String.format("Invalid DATE10 field %d position %d", field, pos), pos); @@ -57,12 +58,20 @@ public class Date10ParseInfo extends FieldParseInfo { //we have to use the current date for reference and change what comes in the buffer Calendar cal = Calendar.getInstance(); //Set the month in the date - 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); - cal.set(Calendar.HOUR_OF_DAY, ((buf[pos + 4] - 48) * 10) + buf[pos + 5] - 48); - cal.set(Calendar.MINUTE, ((buf[pos + 6] - 48) * 10) + buf[pos + 7] - 48); - cal.set(Calendar.SECOND, ((buf[pos + 8] - 48) * 10) + buf[pos + 9] - 48); - cal.set(Calendar.MILLISECOND,0); + if (forceStringDecoding) { + cal.set(Calendar.MONTH, Integer.parseInt(new String(buf, pos, 2, getCharacterEncoding()), 10)-1); + cal.set(Calendar.DATE, Integer.parseInt(new String(buf, pos+2, 2, getCharacterEncoding()), 10)); + cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(new String(buf, pos+4, 2, getCharacterEncoding()), 10)); + cal.set(Calendar.MINUTE, Integer.parseInt(new String(buf, pos+6, 2, getCharacterEncoding()), 10)); + cal.set(Calendar.SECOND, Integer.parseInt(new String(buf, pos+8, 2, getCharacterEncoding()), 10)); + } 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); + cal.set(Calendar.HOUR_OF_DAY, ((buf[pos + 4] - 48) * 10) + buf[pos + 5] - 48); + cal.set(Calendar.MINUTE, ((buf[pos + 6] - 48) * 10) + buf[pos + 7] - 48); + cal.set(Calendar.SECOND, ((buf[pos + 8] - 48) * 10) + buf[pos + 9] - 48); + } + cal.set(Calendar.MILLISECOND,0); adjustWithFutureTolerance(cal); return new IsoValue(type, cal.getTime(), null); } diff --git a/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java b/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java index 3fa3c06..d7ac44c 100644 --- a/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/Date4ParseInfo.java @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package com.solab.iso8583.parse; +import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.util.Calendar; import java.util.Date; @@ -38,7 +39,8 @@ public class Date4ParseInfo extends FieldParseInfo { @Override public IsoValue parse(final int field, final byte[] buf, final int pos, - final CustomField custom) throws ParseException { + final CustomField custom) + throws ParseException, UnsupportedEncodingException { if (pos < 0) { throw new ParseException(String.format("Invalid DATE4 field %d position %d", field, pos), pos); @@ -53,8 +55,13 @@ public class Date4ParseInfo extends FieldParseInfo { cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); //Set the month in the date - 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 (forceStringDecoding) { + cal.set(Calendar.MONTH, Integer.parseInt(new String(buf, pos, 2, getCharacterEncoding()), 10)-1); + cal.set(Calendar.DATE, Integer.parseInt(new String(buf, pos+2, 2, getCharacterEncoding()), 10)); + } 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); + } Date10ParseInfo.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 8e6ef9a..a72c3fb 100644 --- a/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/DateExpParseInfo.java @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package com.solab.iso8583.parse; +import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.util.Calendar; import java.util.Date; @@ -39,7 +40,7 @@ public class DateExpParseInfo extends FieldParseInfo { @Override public IsoValue parse(final int field, final byte[] buf, final int pos, final CustomField custom) - throws ParseException { + throws ParseException, UnsupportedEncodingException { if (pos < 0) { throw new ParseException(String.format("Invalid DATE_EXP field %d position %d", field, pos), pos); @@ -54,9 +55,15 @@ public class DateExpParseInfo extends FieldParseInfo { cal.set(Calendar.SECOND, 0); cal.set(Calendar.DATE, 1); //Set the month in the date - 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 (forceStringDecoding) { + cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) - (cal.get(Calendar.YEAR) % 100) + + Integer.parseInt(new String(buf, pos, 2, getCharacterEncoding()))); + cal.set(Calendar.MONTH, Integer.parseInt(new String(buf, pos+2, 2, getCharacterEncoding()))-1); + } else { + 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); + } 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 acd4e22..9af3ad6 100644 --- a/src/main/java/com/solab/iso8583/parse/TimeParseInfo.java +++ b/src/main/java/com/solab/iso8583/parse/TimeParseInfo.java @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package com.solab.iso8583.parse; +import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.util.Calendar; import java.util.Date; @@ -40,7 +41,7 @@ public class TimeParseInfo extends FieldParseInfo { @Override public IsoValue parse(final int field, final byte[] buf, final int pos, final CustomField custom) - throws ParseException { + throws ParseException, UnsupportedEncodingException { if (pos < 0) { throw new ParseException(String.format("Invalid TIME field %d pos %d", field, pos), pos); @@ -49,9 +50,15 @@ public class TimeParseInfo extends FieldParseInfo { "Insufficient data for TIME field %d, pos %d", field, pos), pos); } Calendar cal = Calendar.getInstance(); - 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 (forceStringDecoding) { + cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(new String(buf, pos, 2, getCharacterEncoding()), 10)); + cal.set(Calendar.MINUTE, Integer.parseInt(new String(buf, pos+2, 2, getCharacterEncoding()), 10)); + cal.set(Calendar.SECOND, Integer.parseInt(new String(buf, pos+4, 2, getCharacterEncoding()), 10)); + } else { + 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); + } return new IsoValue(type, cal.getTime(), null); }