Stanislav Ochotnicky b2ad8a6
From 6af11cb2cfdf83ce013a531005077259984c55e7 Mon Sep 17 00:00:00 2001
Stanislav Ochotnicky b2ad8a6
From: Stanislav Ochotnicky <sochotnicky@redhat.com>
Stanislav Ochotnicky b2ad8a6
Date: Wed, 22 Feb 2012 11:21:06 +0100
ea0a295
Subject: [PATCH] Fix FastDateFormat for Java 7 behaviour
Stanislav Ochotnicky b2ad8a6
Stanislav Ochotnicky b2ad8a6
Backported from 1146138
Stanislav Ochotnicky b2ad8a6
See https://issues.apache.org/jira/browse/LANG-719 for more information
Stanislav Ochotnicky b2ad8a6
---
Stanislav Ochotnicky b2ad8a6
 .../apache/commons/lang/time/FastDateFormat.java   |   14 ++++++++++----
Stanislav Ochotnicky b2ad8a6
 .../commons/lang/time/FastDateFormatTest.java      |    5 +++--
Stanislav Ochotnicky b2ad8a6
 2 files changed, 13 insertions(+), 6 deletions(-)
Stanislav Ochotnicky b2ad8a6
Stanislav Ochotnicky b2ad8a6
diff --git a/src/main/java/org/apache/commons/lang/time/FastDateFormat.java b/src/main/java/org/apache/commons/lang/time/FastDateFormat.java
Stanislav Ochotnicky b2ad8a6
index 2ca7e5c..b7e19ec 100644
Stanislav Ochotnicky b2ad8a6
--- a/src/main/java/org/apache/commons/lang/time/FastDateFormat.java
Stanislav Ochotnicky b2ad8a6
+++ b/src/main/java/org/apache/commons/lang/time/FastDateFormat.java
Stanislav Ochotnicky b2ad8a6
@@ -49,7 +49,7 @@ import org.apache.commons.lang.text.StrBuilder;
Stanislav Ochotnicky b2ad8a6
  * 

Stanislav Ochotnicky b2ad8a6
  *
Stanislav Ochotnicky b2ad8a6
  * 

Only formatting is supported, but all patterns are compatible with

Stanislav Ochotnicky b2ad8a6
- * SimpleDateFormat (except time zones - see below).

Stanislav Ochotnicky b2ad8a6
+ * SimpleDateFormat (except time zones and some year patterns - see below).

Stanislav Ochotnicky b2ad8a6
  *
Stanislav Ochotnicky b2ad8a6
  * 

Java 1.4 introduced a new pattern letter, 'Z', to represent

Stanislav Ochotnicky b2ad8a6
  * time zones in RFC822 format (eg. +0800 or -1100).
Stanislav Ochotnicky b2ad8a6
@@ -60,6 +60,12 @@ import org.apache.commons.lang.text.StrBuilder;
Stanislav Ochotnicky b2ad8a6
  * This introduces a minor incompatibility with Java 1.4, but at a gain of
Stanislav Ochotnicky b2ad8a6
  * useful functionality.

Stanislav Ochotnicky b2ad8a6
  *
Stanislav Ochotnicky b2ad8a6
+ * 

Javadoc cites for the year pattern: For formatting, if the number of

Stanislav Ochotnicky b2ad8a6
+ * pattern letters is 2, the year is truncated to 2 digits; otherwise it is
Stanislav Ochotnicky b2ad8a6
+ * interpreted as a number. Starting with Java 1.7 a pattern of 'Y' or
Stanislav Ochotnicky b2ad8a6
+ * 'YYY' will be formatted as '2003', while it was '03' in former Java
Stanislav Ochotnicky b2ad8a6
+ * versions. FastDateFormat implements the behavior of Java 7.

Stanislav Ochotnicky b2ad8a6
+ *
Stanislav Ochotnicky b2ad8a6
  * @author Apache Software Foundation
Stanislav Ochotnicky b2ad8a6
  * @author TeaTrove project
Stanislav Ochotnicky b2ad8a6
  * @author Brian S O'Neill
Stanislav Ochotnicky b2ad8a6
@@ -606,10 +612,10 @@ public class FastDateFormat extends Format {
Stanislav Ochotnicky b2ad8a6
                 rule = new TextField(Calendar.ERA, ERAs);
Stanislav Ochotnicky b2ad8a6
                 break;
Stanislav Ochotnicky b2ad8a6
             case 'y': // year (number)
Stanislav Ochotnicky b2ad8a6
-                if (tokenLen >= 4) {
Stanislav Ochotnicky b2ad8a6
-                    rule = selectNumberRule(Calendar.YEAR, tokenLen);
Stanislav Ochotnicky b2ad8a6
-                } else {
Stanislav Ochotnicky b2ad8a6
+                if (tokenLen == 2) {
Stanislav Ochotnicky b2ad8a6
                     rule = TwoDigitYearField.INSTANCE;
Stanislav Ochotnicky b2ad8a6
+                } else {
Stanislav Ochotnicky b2ad8a6
+                    rule = selectNumberRule(Calendar.YEAR, tokenLen < 4 ? 4 : tokenLen);
Stanislav Ochotnicky b2ad8a6
                 }
Stanislav Ochotnicky b2ad8a6
                 break;
Stanislav Ochotnicky b2ad8a6
             case 'M': // month in year (text and number)
Stanislav Ochotnicky b2ad8a6
diff --git a/src/test/java/org/apache/commons/lang/time/FastDateFormatTest.java b/src/test/java/org/apache/commons/lang/time/FastDateFormatTest.java
Stanislav Ochotnicky b2ad8a6
index 8232747..bd4d664 100644
Stanislav Ochotnicky b2ad8a6
--- a/src/test/java/org/apache/commons/lang/time/FastDateFormatTest.java
Stanislav Ochotnicky b2ad8a6
+++ b/src/test/java/org/apache/commons/lang/time/FastDateFormatTest.java
Stanislav Ochotnicky b2ad8a6
@@ -230,8 +230,9 @@ public class FastDateFormatTest extends TestCase {
Stanislav Ochotnicky b2ad8a6
                 " dddd ddd dd d DDDD DDD DD D EEEE EEE EE E aaaa aaa aa a zzzz zzz zz z";
Stanislav Ochotnicky b2ad8a6
             fdf = FastDateFormat.getInstance(pattern);
Stanislav Ochotnicky b2ad8a6
             sdf = new SimpleDateFormat(pattern);
Stanislav Ochotnicky b2ad8a6
-            assertEquals(sdf.format(date1), fdf.format(date1));
Stanislav Ochotnicky b2ad8a6
-            assertEquals(sdf.format(date2), fdf.format(date2));
Stanislav Ochotnicky b2ad8a6
+            // SDF bug fix starting with Java 7
Stanislav Ochotnicky b2ad8a6
+            assertEquals(sdf.format(date1).replaceAll("2003 03 03 03", "2003 2003 03 2003"), fdf.format(date1));
Stanislav Ochotnicky b2ad8a6
+            assertEquals(sdf.format(date2).replaceAll("2003 03 03 03", "2003 2003 03 2003"), fdf.format(date2));
Stanislav Ochotnicky b2ad8a6
 
Stanislav Ochotnicky b2ad8a6
         } finally {
Stanislav Ochotnicky b2ad8a6
             Locale.setDefault(realDefaultLocale);
Stanislav Ochotnicky b2ad8a6
-- 
Stanislav Ochotnicky b2ad8a6
1.7.7.6
Stanislav Ochotnicky b2ad8a6