You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ms...@apache.org on 2015/02/02 19:27:42 UTC
svn commit: r1656533 - in /pdfbox/trunk/xmpbox/src:
main/java/org/apache/xmpbox/DateConverter.java
test/java/org/apache/xmpbox/DateConverterTest.java
Author: msahyoun
Date: Mon Feb 2 18:27:42 2015
New Revision: 1656533
URL: http://svn.apache.org/r1656533
Log:
PDFBOX-2319 support additional date time strings
Added:
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/DateConverterTest.java (with props)
Modified:
pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/DateConverter.java
Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/DateConverter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/DateConverter.java?rev=1656533&r1=1656532&r2=1656533&view=diff
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/DateConverter.java (original)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/DateConverter.java Mon Feb 2 18:27:42 2015
@@ -28,6 +28,9 @@ import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.SimpleTimeZone;
+import java.util.TimeZone;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* This class is used to convert dates to strings and back using the PDF date standards. Date are described in
@@ -47,8 +50,12 @@ public class DateConverter
// to try if the original one does not work.
private static final SimpleDateFormat[] POTENTIAL_FORMATS = new SimpleDateFormat[] {
new SimpleDateFormat("EEEE, dd MMM yyyy hh:mm:ss a"),
- new SimpleDateFormat("EEEE, MMM dd, yyyy hh:mm:ss a"), new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"),
- new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz") };
+ new SimpleDateFormat("EEEE, MMM dd, yyyy hh:mm:ss a"),
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"),
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"),
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"),
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S")
+ };
/**
* According to check-style, Utility classes should not have a public or default constructor.
@@ -84,7 +91,13 @@ public class DateConverter
try
{
SimpleTimeZone zone = null;
- if (date.startsWith("D:"))
+
+ if (Pattern.matches("^\\d{4}-\\d{2}-\\d{2}T.*", date))
+ {
+ // Assuming ISO860 date string
+ return fromISO8601(date);
+ }
+ else if (date.startsWith("D:"))
{
date = date.substring(2, date.length());
}
@@ -281,4 +294,50 @@ public class DateConverter
retval.append(Integer.toString(minutes));
return retval.toString();
}
+
+ /**
+ * Get a Calendar from an ISO8601 date string.
+ *
+ * @param dateString
+ * @return the Calendar instance.
+ */
+ private static Calendar fromISO8601(String dateString)
+ {
+ // Pattern to test for a time zone string
+ Pattern timeZonePattern = Pattern.compile(
+ "[\\d-]*T?[\\d-\\.]([A-Z]{1,4})$|(.*\\d*)([A-Z][a-z]+\\/[A-Z][a-z]+)$"
+ );
+ Matcher timeZoneMatcher = timeZonePattern.matcher(dateString);
+
+ String timeZoneString = null;
+
+ while (timeZoneMatcher.find())
+ {
+ for (int i = 1; i <= timeZoneMatcher.groupCount(); i++)
+ {
+ if (timeZoneMatcher.group(i) != null)
+ {
+ timeZoneString = timeZoneMatcher.group(i);
+ }
+ }
+ }
+
+ if (timeZoneString != null)
+ {
+
+ Calendar cal = javax.xml.bind.DatatypeConverter.parseDateTime(
+ dateString.substring(0, dateString.indexOf(timeZoneString))
+
+ );
+
+ TimeZone z = TimeZone.getTimeZone(timeZoneString);
+ cal.setTimeZone(z);
+
+ return cal;
+ }
+ else
+ {
+ return javax.xml.bind.DatatypeConverter.parseDateTime(dateString);
+ }
+ }
}
Added: pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/DateConverterTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/DateConverterTest.java?rev=1656533&view=auto
==============================================================================
--- pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/DateConverterTest.java (added)
+++ pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/DateConverterTest.java Mon Feb 2 18:27:42 2015
@@ -0,0 +1,61 @@
+package org.apache.xmpbox;
+
+import static org.junit.Assert.assertEquals;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+/**
+ * Test the date conversion utility.
+ *
+ */
+public class DateConverterTest
+{
+
+ /**
+ * Test several ISO6801 date formats.
+ *
+ * Test with additional time zone
+ * information normally not supported by ISO8601
+ *
+ * @throws Exception when there is an exception
+ */
+ @Test
+ public void testDateConversion() throws Exception
+ {
+
+ final SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd'T'HH:mm.ss.SSSXXX");
+ Calendar jaxbCal = null,
+ convDate = null;
+ // Test partial dates
+ convDate = DateConverter.toCalendar("2015-02-02");
+ assertEquals(2015, convDate.get(Calendar.YEAR));
+
+ // Test some time zone offsets
+ jaxbCal = javax.xml.bind.DatatypeConverter.parseDateTime("2015-02-02T16:37:19.192Z");
+ convDate = DateConverter.toCalendar("2015-02-02T16:37:19.192Z");
+ assertEquals(dateFormat.format(jaxbCal.getTime()), dateFormat.format(convDate.getTime()));
+
+ jaxbCal = javax.xml.bind.DatatypeConverter.parseDateTime("2015-02-02T16:37:19.192+00:00");
+ convDate = DateConverter.toCalendar("2015-02-02T16:37:19.192Z");
+ assertEquals(dateFormat.format(jaxbCal.getTime()), dateFormat.format(convDate.getTime()));
+
+ jaxbCal = javax.xml.bind.DatatypeConverter.parseDateTime("2015-02-02T16:37:19.192+02:00");
+ convDate = DateConverter.toCalendar("2015-02-02T16:37:19.192+02:00");
+ assertEquals(dateFormat.format(jaxbCal.getTime()), dateFormat.format(convDate.getTime()));
+
+ jaxbCal = javax.xml.bind.DatatypeConverter.parseDateTime("2015-02-02T16:37:19.192Z");
+ convDate = DateConverter.toCalendar("2015-02-02T08:37:19.192PST");
+ assertEquals(dateFormat.format(jaxbCal.getTime()), dateFormat.format(convDate.getTime()));
+
+ jaxbCal = javax.xml.bind.DatatypeConverter.parseDateTime("2015-02-02T16:37:19.192+01:00");
+ convDate = DateConverter.toCalendar("2015-02-02T16:37:19.192Europe/Berlin");
+ assertEquals(dateFormat.format(jaxbCal.getTime()), dateFormat.format(convDate.getTime()));
+
+ }
+}
Propchange: pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/DateConverterTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/DateConverterTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain