Michael Simacek 78b64c
From 5986eae18fc6006ac4b39c35a7cb7ced8e70c61e Mon Sep 17 00:00:00 2001
Michael Simacek 78b64c
From: Michael Simacek <msimacek@redhat.com>
Michael Simacek 78b64c
Date: Mon, 15 Feb 2016 15:02:45 +0100
Michael Simacek 78b64c
Subject: [PATCH] Fix parsing of ISO dates with UTC TZ
Michael Simacek 78b64c
Michael Simacek 78b64c
---
Michael Simacek 78b64c
 .../java/org/apache/commons/lang3/time/DateUtils.java   |  3 ++-
Michael Simacek 78b64c
 .../org/apache/commons/lang3/time/DateUtilsTest.java    | 17 ++++++++++++-----
Michael Simacek 78b64c
 2 files changed, 14 insertions(+), 6 deletions(-)
Michael Simacek 78b64c
Michael Simacek 78b64c
diff --git a/src/main/java/org/apache/commons/lang3/time/DateUtils.java b/src/main/java/org/apache/commons/lang3/time/DateUtils.java
Michael Simacek 78b64c
index 7535b8b..8312031 100644
Michael Simacek 78b64c
--- a/src/main/java/org/apache/commons/lang3/time/DateUtils.java
Michael Simacek 78b64c
+++ b/src/main/java/org/apache/commons/lang3/time/DateUtils.java
Michael Simacek 78b64c
@@ -390,7 +390,8 @@ public class DateUtils {
Michael Simacek 78b64c
             String str2 = str;
Michael Simacek 78b64c
             // LANG-530 - need to make sure 'ZZ' output doesn't hit SimpleDateFormat as it will ParseException
Michael Simacek 78b64c
             if (parsePattern.endsWith("ZZ")) {
Michael Simacek 78b64c
-                str2 = str.replaceAll("([-+][0-9][0-9]):([0-9][0-9])$", "$1$2"); 
Michael Simacek 78b64c
+                str2 = str.replaceAll("([-+][0-9][0-9]):([0-9][0-9])$", "$1$2");
Michael Simacek 78b64c
+                str2 = str2.replaceAll("Z$", "+0000");
Michael Simacek 78b64c
             }
Michael Simacek 78b64c
 
Michael Simacek 78b64c
             final Date date = parser.parse(str2, pos);
Michael Simacek 78b64c
diff --git a/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java b/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java
Michael Simacek 78b64c
index 7ef0b8a..a20cf3f 100644
Michael Simacek 78b64c
--- a/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java
Michael Simacek 78b64c
+++ b/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java
Michael Simacek 78b64c
@@ -30,6 +30,7 @@ import java.lang.reflect.Modifier;
Michael Simacek 78b64c
 import java.text.DateFormat;
Michael Simacek 78b64c
 import java.text.ParseException;
Michael Simacek 78b64c
 import java.text.SimpleDateFormat;
Michael Simacek 78b64c
+import java.time.ZoneId;
Michael Simacek 78b64c
 import java.util.Calendar;
Michael Simacek 78b64c
 import java.util.Date;
Michael Simacek 78b64c
 import java.util.GregorianCalendar;
Michael Simacek 78b64c
@@ -1218,11 +1219,17 @@ public class DateUtilsTest {
Michael Simacek 78b64c
     // http://issues.apache.org/jira/browse/LANG-530
Michael Simacek 78b64c
     @Test
Michael Simacek 78b64c
     public void testLang530() throws ParseException {
Michael Simacek 78b64c
-        final Date d = new Date();
Michael Simacek 78b64c
-        final String isoDateStr = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(d);
Michael Simacek 78b64c
-        final Date d2 = DateUtils.parseDate(isoDateStr, new String[] { DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern() });
Michael Simacek 78b64c
-        // the format loses milliseconds so have to reintroduce them
Michael Simacek 78b64c
-        assertEquals("Date not equal to itself ISO formatted and parsed", d.getTime(), d2.getTime() + d.getTime() % 1000); 
Michael Simacek 78b64c
+        for (long i = 1455545305000L; i <= 1455545306000L; i += 43) {
Michael Simacek 78b64c
+            for (String id : ZoneId.getAvailableZoneIds()) {
Michael Simacek 78b64c
+                final Date d = new Date(i);
Michael Simacek 78b64c
+                FastDateFormat fmt = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ", TimeZone.getTimeZone(id));
Michael Simacek 78b64c
+                final String isoDateStr = fmt.format(d);
Michael Simacek 78b64c
+                final Date d2 = DateUtils.parseDate(isoDateStr, new String[] { fmt.getPattern() });
Michael Simacek 78b64c
+                // the format loses milliseconds so have to reintroduce them
Michael Simacek 78b64c
+                assertEquals("Date not equal to itself ISO formatted and parsed", d.getTime(),
Michael Simacek 78b64c
+                        d2.getTime() + d.getTime() % 1000);
Michael Simacek 78b64c
+            }
Michael Simacek 78b64c
+        }
Michael Simacek 78b64c
     }
Michael Simacek 78b64c
     
Michael Simacek 78b64c
     /**
Michael Simacek 78b64c
-- 
Michael Simacek 78b64c
2.5.0
Michael Simacek 78b64c