From e7613f09616bceedfa447c3402d3702b0487af77 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Thu, 17 Jan 2013 13:08:47 -0800 Subject: [PATCH] First pass at parsing ISO dates --- .../todoroo/andlib/utility/DateUtilities.java | 21 ++++++++++ .../actfm/sync/messages/MakeChanges.java | 14 ++++++- .../andlib/utility/DateUtilitiesTest.java | 42 +++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/api/src/com/todoroo/andlib/utility/DateUtilities.java b/api/src/com/todoroo/andlib/utility/DateUtilities.java index 7f3cfb4e3..82edb84b8 100644 --- a/api/src/com/todoroo/andlib/utility/DateUtilities.java +++ b/api/src/com/todoroo/andlib/utility/DateUtilities.java @@ -5,6 +5,7 @@ */ package com.todoroo.andlib.utility; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; @@ -267,4 +268,24 @@ public class DateUtilities { return date.getTime(); } + public static Date parseIso8601(String iso8601String) throws ParseException { + String formatString; + if (iso8601String.endsWith("Z")) { //$NON-NLS-1$ + // Time exists + iso8601String = iso8601String.replace("Z", "+00:00"); //$NON-NLS-1$ //$NON-NLS-2$ + try { + iso8601String = iso8601String.substring(0, 22) + iso8601String.substring(23); + } catch (IndexOutOfBoundsException e) { + e.printStackTrace(); + throw new ParseException("Invalid ISO 8601 length", 0); //$NON-NLS-1$ + } + formatString = "yyyy-MM-dd'T'HH:mm:ssZ"; //$NON-NLS-1$ + } else { + formatString = "yyyy-MM-dd"; //$NON-NLS-1$ + } + + Date result = new SimpleDateFormat(formatString).parse(iso8601String); + return result; + } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java index f6b12963a..9987dcf2a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java @@ -1,5 +1,6 @@ package com.todoroo.astrid.actfm.sync.messages; +import java.text.ParseException; import java.util.Iterator; import org.json.JSONException; @@ -15,11 +16,13 @@ import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.data.Property.StringProperty; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.dao.RemoteModelDao; import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.SyncFlags; +import com.todoroo.astrid.data.Task; @SuppressWarnings("nls") public class MakeChanges extends ServerToClientMessage { @@ -166,8 +169,15 @@ public class MakeChanges extends ServerToClientMessage value = 0; else if (property.checkFlag(Property.PROP_FLAG_DATE)) { String valueString = data.getString(key); - // Parse string and setup time value - value = value * 1000L; + try { + value = DateUtilities.parseIso8601(valueString).getTime(); + if (Task.DUE_DATE.equals(property)) { + boolean hasDueTime = valueString.endsWith("Z"); + value = Task.createDueDate(hasDueTime ? Task.URGENCY_SPECIFIC_DAY_TIME : Task.URGENCY_SPECIFIC_DAY, value); + } + } catch (ParseException e){ + value = 0; + } } model.setValue((LongProperty) property, value); } catch (JSONException e) { diff --git a/tests/src/com/todoroo/andlib/utility/DateUtilitiesTest.java b/tests/src/com/todoroo/andlib/utility/DateUtilitiesTest.java index e78a4223f..2291b94f9 100644 --- a/tests/src/com/todoroo/andlib/utility/DateUtilitiesTest.java +++ b/tests/src/com/todoroo/andlib/utility/DateUtilitiesTest.java @@ -5,7 +5,10 @@ */ package com.todoroo.andlib.utility; +import java.text.ParseException; +import java.util.Calendar; import java.util.Date; +import java.util.TimeZone; import com.todoroo.andlib.test.TodorooTestCase; @@ -62,4 +65,43 @@ public class DateUtilitiesTest extends TodorooTestCase { }); } + + public void testParseISO8601() { + String withTime = "2013-01-28T13:17:02Z"; + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + try { + date = DateUtilities.parseIso8601(withTime); + cal.setTime(date); + cal.setTimeZone(TimeZone.getTimeZone("UTC")); + } catch (ParseException e) { + e.printStackTrace(); + fail("Parse exception"); + } + assertEquals(2013, cal.get(Calendar.YEAR)); + assertEquals(0, cal.get(Calendar.MONTH)); + assertEquals(28, cal.get(Calendar.DATE)); + assertEquals(13, cal.get(Calendar.HOUR_OF_DAY)); + assertEquals(17, cal.get(Calendar.MINUTE)); + assertEquals(2, cal.get(Calendar.SECOND)); + } + + public void testParseISO8601NoTime() { + String withTime = "2013-01-28"; + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + try { + date = DateUtilities.parseIso8601(withTime); + cal.setTime(date); + } catch (ParseException e) { + e.printStackTrace(); + fail("Parse exception"); + } + assertEquals(2013, cal.get(Calendar.YEAR)); + assertEquals(0, cal.get(Calendar.MONTH)); + assertEquals(28, cal.get(Calendar.DATE)); + assertEquals(0, cal.get(Calendar.HOUR_OF_DAY)); + assertEquals(0, cal.get(Calendar.MINUTE)); + assertEquals(0, cal.get(Calendar.SECOND)); + } }