You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ch...@apache.org on 2015/05/01 04:22:53 UTC

[lang] LANG-916: DateFormatUtils.format does not correctly change Calendar TimeZone in certain situations LANG-1123: Unit test FastDatePrinterTimeZonesTest needs a timezone set

Repository: commons-lang
Updated Branches:
  refs/heads/master bea1ae92a -> 775203dd2


LANG-916: DateFormatUtils.format does not correctly change Calendar TimeZone in certain situations
LANG-1123: Unit test FastDatePrinterTimeZonesTest needs a timezone set


Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/775203dd
Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/775203dd
Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/775203dd

Branch: refs/heads/master
Commit: 775203dd2cfce017910d04c58a0b1b4e0a64923c
Parents: bea1ae9
Author: Chas Honton <ch...@apache.org>
Authored: Thu Apr 30 19:21:26 2015 -0700
Committer: Chas Honton <ch...@apache.org>
Committed: Thu Apr 30 19:21:26 2015 -0700

----------------------------------------------------------------------
 src/changes/changes.xml                         |   2 +
 .../commons/lang3/time/DateFormatUtils.java     |   9 +
 .../apache/commons/lang3/time/DatePrinter.java  |  11 +-
 .../commons/lang3/time/FastDatePrinter.java     |   3 +-
 .../commons/lang3/time/DateFormatUtilsTest.java | 197 +++++++++----------
 .../lang3/time/DurationFormatUtilsTest.java     |   2 +-
 .../commons/lang3/time/FastDatePrinterTest.java |  30 ++-
 .../time/FastDatePrinterTimeZonesTest.java      |   2 +-
 8 files changed, 143 insertions(+), 113 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d75b9c6..a7320df 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -22,6 +22,8 @@
   <body>
 
   <release version="3.5" date="tba" description="tba">
+    <action issue="LANG-1123" type="fix" dev="chas" due-to="Christian P. Momon">Unit test FastDatePrinterTimeZonesTest needs a timezone set</action>
+    <action issue="LANG-916" type="fix" dev="chas" due-to="Christian P. Momon">DateUtilsTest.testLang530 fails for some timezones</action>
     <action issue="LANG-1116" type="fix" dev="chas" due-to="Aaron Sheldon">DateUtilsTest.testLang530 fails for some timezones</action>
     <action issue="LANG-1114" type="fix" dev="britter" due-to="Andy Coates">TypeUtils.ParameterizedType#equals doesn't work with wildcard types</action>
     <action issue="LANG-1119" type="add" dev="britter" due-to="Loic Guibert">Add rotate(string, int) method to StringUtils</action>

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java b/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java
index 4315e47..17cd6e6 100644
--- a/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java
+++ b/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java
@@ -43,6 +43,7 @@ public class DateFormatUtils {
     /**
      * ISO 8601 formatter for date-time without time zone.
      * The format used is {@code yyyy-MM-dd'T'HH:mm:ss}.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_DATETIME_FORMAT
             = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss");
@@ -50,6 +51,7 @@ public class DateFormatUtils {
     /**
      * ISO 8601 formatter for date-time with time zone.
      * The format used is {@code yyyy-MM-dd'T'HH:mm:ssZZ}.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_DATETIME_TIME_ZONE_FORMAT
             = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ");
@@ -57,6 +59,7 @@ public class DateFormatUtils {
     /**
      * ISO 8601 formatter for date without time zone.
      * The format used is {@code yyyy-MM-dd}.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_DATE_FORMAT
             = FastDateFormat.getInstance("yyyy-MM-dd");
@@ -66,6 +69,7 @@ public class DateFormatUtils {
      * The format used is {@code yyyy-MM-ddZZ}.
      * This pattern does not comply with the formal ISO 8601 specification
      * as the standard does not allow a time zone  without a time.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_DATE_TIME_ZONE_FORMAT
             = FastDateFormat.getInstance("yyyy-MM-ddZZ");
@@ -73,6 +77,7 @@ public class DateFormatUtils {
     /**
      * ISO 8601 formatter for time without time zone.
      * The format used is {@code 'T'HH:mm:ss}.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_TIME_FORMAT
             = FastDateFormat.getInstance("'T'HH:mm:ss");
@@ -80,6 +85,7 @@ public class DateFormatUtils {
     /**
      * ISO 8601 formatter for time with time zone.
      * The format used is {@code 'T'HH:mm:ssZZ}.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_TIME_TIME_ZONE_FORMAT
             = FastDateFormat.getInstance("'T'HH:mm:ssZZ");
@@ -89,6 +95,7 @@ public class DateFormatUtils {
      * The format used is {@code HH:mm:ss}.
      * This pattern does not comply with the formal ISO 8601 specification
      * as the standard requires the 'T' prefix for times.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_TIME_NO_T_FORMAT
             = FastDateFormat.getInstance("HH:mm:ss");
@@ -98,6 +105,7 @@ public class DateFormatUtils {
      * The format used is {@code HH:mm:ssZZ}.
      * This pattern does not comply with the formal ISO 8601 specification
      * as the standard requires the 'T' prefix for times.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat ISO_TIME_NO_T_TIME_ZONE_FORMAT
             = FastDateFormat.getInstance("HH:mm:ssZZ");
@@ -105,6 +113,7 @@ public class DateFormatUtils {
     /**
      * SMTP (and probably other) date headers.
      * The format used is {@code EEE, dd MMM yyyy HH:mm:ss Z} in US locale.
+     * This format uses the default TimeZone in effect at the time of loading DateFormatUtils class.
      */
     public static final FastDateFormat SMTP_DATETIME_FORMAT
             = FastDateFormat.getInstance("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/main/java/org/apache/commons/lang3/time/DatePrinter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/time/DatePrinter.java b/src/main/java/org/apache/commons/lang3/time/DatePrinter.java
index d1bfb91..6808628 100644
--- a/src/main/java/org/apache/commons/lang3/time/DatePrinter.java
+++ b/src/main/java/org/apache/commons/lang3/time/DatePrinter.java
@@ -49,8 +49,11 @@ public interface DatePrinter {
 
     /**
      * <p>Formats a {@code Calendar} object.</p>
+     * The TimeZone set on the Calendar is only used to adjust the time offset.
+     * The TimeZone specified during the construction of the Parser will determine the TimeZone
+     * used in the formatted string.
      *
-     * @param calendar  the calendar to format
+     * @param calendar  the calendar to format.
      * @return the formatted string
      */
     String format(Calendar calendar);
@@ -76,8 +79,10 @@ public interface DatePrinter {
     StringBuffer format(Date date, StringBuffer buf);
 
     /**
-     * <p>Formats a {@code Calendar} object into the
-     * supplied {@code StringBuffer}.</p>
+     * <p>Formats a {@code Calendar} object into the supplied {@code StringBuffer}.</p>
+     * The TimeZone set on the Calendar is only used to adjust the time offset.
+     * The TimeZone specified during the construction of the Parser will determine the TimeZone
+     * used in the formatted string.
      *
      * @param calendar  the calendar to format
      * @param buf  the buffer to format into

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
index ac73646..4a20333 100644
--- a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
+++ b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
@@ -477,7 +477,8 @@ public class FastDatePrinter implements DatePrinter, Serializable {
      */
     @Override
     public StringBuffer format(final Calendar calendar, final StringBuffer buf) {
-        return applyRules(calendar, buf);
+        // do not pass in calendar directly, this will cause TimeZone of FastDatePrinter to be ignored
+        return format(calendar.getTime(), buf);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java b/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java
index 5a1d69f..425ec6c 100644
--- a/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java
@@ -108,132 +108,75 @@ public class DateFormatUtilsTest {
         
         assertEquals ("2005-01-01T12:00:00", DateFormatUtils.formatUTC(c.getTime().getTime(), DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), Locale.US));
     }
+
+    private void assertFormats(String expectedValue, String pattern, TimeZone timeZone, Calendar cal) {
+        assertEquals(expectedValue, DateFormatUtils.format(cal.getTime(), pattern, timeZone));
+        assertEquals(expectedValue, DateFormatUtils.format(cal.getTime().getTime(), pattern, timeZone));
+        assertEquals(expectedValue, DateFormatUtils.format(cal, pattern, timeZone));
+    }
+
+    private Calendar createFebruaryTestDate(final TimeZone timeZone) {
+        final Calendar cal = Calendar.getInstance(timeZone);
+        cal.set(2002, Calendar.FEBRUARY, 23, 9, 11, 12);
+        return cal;
+    }
+
+    private Calendar createJuneTestDate(final TimeZone timeZone) {
+        final Calendar cal = Calendar.getInstance(timeZone);
+        cal.set(2003, Calendar.JUNE, 8, 10, 11, 12);
+        return cal;
+    }
+
+    private void testGmtMinus3(String expectedValue, String pattern) {
+        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
+        assertFormats(expectedValue, pattern, timeZone, createFebruaryTestDate(timeZone));
+    }
+
+    private void testUTC(String expectedValue, String pattern) {
+        final TimeZone timeZone = TimeZone.getTimeZone("UTC");
+        assertFormats(expectedValue, pattern, timeZone, createFebruaryTestDate(timeZone));
+    }
     
     @Test
     public void testDateTimeISO() throws Exception {
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002, Calendar.FEBRUARY, 23, 9, 11, 12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12", text);
-        text = DateFormatUtils.ISO_DATETIME_FORMAT.format(cal);
-        assertEquals("2002-02-23T09:11:12", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12-03:00", text);
-        text = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("2002-02-23T09:11:12-03:00", text);
-        
-        Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
-        utcCal.set(2002, Calendar.FEBRUARY, 23, 9, 11, 12);
-        utcCal.set(Calendar.MILLISECOND, 0);
-        text = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(utcCal);
-        assertEquals("2002-02-23T09:11:12Z", text);
-        Date date = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.parse(text);
-        assertEquals(utcCal.getTime(), date);
+        testGmtMinus3("2002-02-23T09:11:12", DateFormatUtils.ISO_DATETIME_FORMAT.getPattern());
+        testGmtMinus3("2002-02-23T09:11:12-03:00", DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern());
+        testUTC("2002-02-23T09:11:12Z", DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern());
     }
 
     @Test
     public void testDateISO(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002, Calendar.FEBRUARY, 23, 10, 11, 12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_DATE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.ISO_DATE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23", text);
-        text = DateFormatUtils.ISO_DATE_FORMAT.format(cal);
-        assertEquals("2002-02-23", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23-03:00", text);
-        text = DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("2002-02-23-03:00", text);
+        testGmtMinus3("2002-02-23", DateFormatUtils.ISO_DATE_FORMAT.getPattern());
+        testGmtMinus3("2002-02-23-03:00", DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern());
+        testUTC("2002-02-23Z", DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern());
     }
 
     @Test
     public void testTimeISO(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002, Calendar.FEBRUARY, 23, 10, 11, 12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_TIME_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.ISO_TIME_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12", text);
-        text = DateFormatUtils.ISO_TIME_FORMAT.format(cal);
-        assertEquals("T10:11:12", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12-03:00", text);
-        text = DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("T10:11:12-03:00", text);
+        testGmtMinus3("T09:11:12", DateFormatUtils.ISO_TIME_FORMAT.getPattern());
+        testGmtMinus3("T09:11:12-03:00", DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern());
+        testUTC("T09:11:12Z", DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern());
     }
 
     @Test
     public void testTimeNoTISO(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002, Calendar.FEBRUARY, 23, 10, 11, 12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_TIME_NO_T_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.ISO_TIME_NO_T_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12", text);
-        text = DateFormatUtils.ISO_TIME_NO_T_FORMAT.format(cal);
-        assertEquals("10:11:12", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12-03:00", text);
-        text = DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("10:11:12-03:00", text);
+        testGmtMinus3("09:11:12", DateFormatUtils.ISO_TIME_NO_T_FORMAT.getPattern());
+        testGmtMinus3("09:11:12-03:00", DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern());
+        testUTC("09:11:12Z", DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern());
     }
 
     @Test
     public void testSMTP(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2003, Calendar.JUNE, 8, 10, 11, 12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), timeZone,
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getLocale());
-        assertEquals("Sun, 08 Jun 2003 10:11:12 -0300", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), timeZone,
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getLocale());
-        assertEquals("Sun, 08 Jun 2003 10:11:12 -0300", text);
-        text = DateFormatUtils.SMTP_DATETIME_FORMAT.format(cal);
-        assertEquals("Sun, 08 Jun 2003 10:11:12 -0300", text);
+        TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
+        Calendar june = createJuneTestDate(timeZone);
         
-        // format UTC
-        text = DateFormatUtils.formatUTC(cal.getTime().getTime(), 
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(),
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getLocale());
-        assertEquals("Sun, 08 Jun 2003 13:11:12 +0000", text);
+        assertFormats("Sun, 08 Jun 2003 10:11:12 -0300", DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(),
+                timeZone, june);
+
+        timeZone = TimeZone.getTimeZone("UTC");
+        june = createJuneTestDate(timeZone);
+        assertFormats("Sun, 08 Jun 2003 10:11:12 +0000", DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(),
+                timeZone, june);
     }
 
     /*
@@ -285,4 +228,46 @@ public class DateFormatUtilsTest {
             TimeZone.setDefault(save);
         }
     }
+
+    /**
+     * According to LANG-916 (https://issues.apache.org/jira/browse/LANG-916),
+     * the format method did contain a bug: it did not use the TimeZone data.
+     *
+     * This method test that the bug is fixed.
+     */
+    @Test
+    public void testLang916() throws Exception {
+
+        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
+        cal.clear();
+        cal.set(2009, 9, 16, 8, 42, 16);
+
+        // Long.
+        {
+            String value = DateFormatUtils.format(cal.getTimeInMillis(), DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), TimeZone.getTimeZone("Europe/Paris"));
+            assertEquals("long", "2009-10-16T08:42:16+02:00", value);
+        }
+        {
+            String value = DateFormatUtils.format(cal.getTimeInMillis(), DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), TimeZone.getTimeZone("Asia/Kolkata"));
+            assertEquals("long", "2009-10-16T12:12:16+05:30", value);
+        }
+        {
+            String value = DateFormatUtils.format(cal.getTimeInMillis(), DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), TimeZone.getTimeZone("Europe/London"));
+            assertEquals("long", "2009-10-16T07:42:16+01:00", value);
+        }
+
+        // Calendar.
+        {
+            String value = DateFormatUtils.format(cal, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), TimeZone.getTimeZone("Europe/Paris"));
+            assertEquals("calendar", "2009-10-16T08:42:16+02:00", value);
+        }
+        {
+            String value = DateFormatUtils.format(cal, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), TimeZone.getTimeZone("Asia/Kolkata"));
+            assertEquals("calendar", "2009-10-16T12:12:16+05:30", value);
+        }
+        {
+            String value = DateFormatUtils.format(cal, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), TimeZone.getTimeZone("Europe/London"));
+            assertEquals("calendar", "2009-10-16T07:42:16+01:00", value);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java b/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java
index 1545642..6941f42 100644
--- a/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java
@@ -266,7 +266,7 @@ public class DurationFormatUtilsTest {
         cal.set(Calendar.MILLISECOND, 1);
         String text;
         // repeat a test from testDateTimeISO to compare extended and not extended.
-        text = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(cal);
+        text = DateFormatUtils.format(cal, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
         assertEquals("2002-02-23T09:11:12-03:00", text);
         // test fixture is the same as above, but now with extended format.
         text = DurationFormatUtils.formatPeriod(base.getTime().getTime(), cal.getTime().getTime(),

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java b/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java
index f8b4930..5aaa670 100644
--- a/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java
+++ b/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java
@@ -214,7 +214,7 @@ public class FastDatePrinterTest {
 
         final DatePrinter format = getInstance("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", TimeZone.getTimeZone("GMT"));
         assertEquals("dateTime", "2009-10-16T16:42:16.000Z", format.format(cal.getTime()));
-        assertEquals("dateTime", "2009-10-16T08:42:16.000Z", format.format(cal));
+        assertEquals("dateTime", "2009-10-16T16:42:16.000Z", format.format(cal));
     }
 
     @Test
@@ -339,4 +339,32 @@ public class FastDatePrinterTest {
         assertEquals("0002", getInstance("dddd", SWEDEN).format(cal));
         assertEquals("00002", getInstance("ddddd", SWEDEN).format(cal));
     }
+
+    /**
+     * According to LANG-916 (https://issues.apache.org/jira/browse/LANG-916),
+     * the format method did contain a bug: it did not use the TimeZone data.
+     *
+     * This method test that the bug is fixed.
+     */
+    @Test
+    public void testLang916() throws Exception {
+
+        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
+        cal.clear();
+        cal.set(2009, 9, 16, 8, 42, 16);
+
+        // calendar fast.
+        {
+            String value = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss Z", TimeZone.getTimeZone("Europe/Paris")).format(cal);
+            assertEquals("calendar", "2009-10-16T08:42:16 +0200", value);
+        }
+        {
+            String value = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss Z", TimeZone.getTimeZone("Asia/Kolkata")).format(cal);
+            assertEquals("calendar", "2009-10-16T12:12:16 +0530", value);
+        }
+        {
+            String value = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss Z", TimeZone.getTimeZone("Europe/London")).format(cal);
+            assertEquals("calendar", "2009-10-16T07:42:16 +0100", value);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/775203dd/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java b/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java
index 34ff2f5..3ae5f56 100644
--- a/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java
+++ b/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java
@@ -57,7 +57,7 @@ public class FastDatePrinterTimeZonesTest {
         final SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
         sdf.setTimeZone(timeZone);
         final String expectedValue = sdf.format(cal.getTime());
-        final String actualValue = FastDateFormat.getInstance(PATTERN).format(cal);
+        final String actualValue = FastDateFormat.getInstance(PATTERN, this.timeZone).format(cal);
         assertEquals(expectedValue, actualValue);
     }