From ab538d80f9229ec418d596323cafc7d8f25a2076 Mon Sep 17 00:00:00 2001 From: Clayton Sims Date: Wed, 28 Oct 2020 12:48:29 -0400 Subject: [PATCH 1/2] Fix for TimeData questions incorrectly carrying TZ info --- .../java/org/javarosa/core/model/data/TimeData.java | 2 +- .../java/org/javarosa/core/model/utils/DateUtils.java | 10 ++++++++++ .../javarosa/core/model/data/test/TimeDataTests.java | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/javarosa/core/model/data/TimeData.java b/src/main/java/org/javarosa/core/model/data/TimeData.java index ae301e807e..b2b7f65f30 100755 --- a/src/main/java/org/javarosa/core/model/data/TimeData.java +++ b/src/main/java/org/javarosa/core/model/data/TimeData.java @@ -77,7 +77,7 @@ public void writeExternal(DataOutputStream out) throws IOException { @Override public UncastData uncast() { - return new UncastData(DateUtils.formatTime(d, DateUtils.FORMAT_ISO8601)); + return new UncastData(DateUtils.formatTime(d, DateUtils.FORMAT_ISO8601_WALL_TIME)); } @Override diff --git a/src/main/java/org/javarosa/core/model/utils/DateUtils.java b/src/main/java/org/javarosa/core/model/utils/DateUtils.java index efe7604330..4a2729d435 100755 --- a/src/main/java/org/javarosa/core/model/utils/DateUtils.java +++ b/src/main/java/org/javarosa/core/model/utils/DateUtils.java @@ -20,6 +20,7 @@ public class DateUtils { private static final int MONTH_OFFSET = (1 - Calendar.JANUARY); public static final int FORMAT_ISO8601 = 1; + public static final int FORMAT_ISO8601_WALL_TIME = 10; public static final int FORMAT_HUMAN_READABLE_SHORT = 2; public static final int FORMAT_HUMAN_READABLE_DAYS_FROM_TODAY = 5; public static final int FORMAT_TIMESTAMP_SUFFIX = 7; @@ -296,6 +297,8 @@ private static String formatTime(DateFields f, int format) { switch (format) { case FORMAT_ISO8601: return formatTimeISO8601(f); + case FORMAT_ISO8601_WALL_TIME: + return formatTimeISO8601(f, true); case FORMAT_HUMAN_READABLE_SHORT: return formatTimeColloquial(f); case FORMAT_TIMESTAMP_SUFFIX: @@ -342,7 +345,14 @@ private static String formatDateSuffix(DateFields f) { } private static String formatTimeISO8601(DateFields f) { + return formatTimeISO8601(f, false); + } + + private static String formatTimeISO8601(DateFields f, boolean suppressTimezone) { String time = intPad(f.hour, 2) + ":" + intPad(f.minute, 2) + ":" + intPad(f.second, 2) + "." + intPad(f.secTicks, 3); + if (suppressTimezone) { + return time; + } int offset; if (timezoneOffset() != -1) { diff --git a/src/test/java/org/javarosa/core/model/data/test/TimeDataTests.java b/src/test/java/org/javarosa/core/model/data/test/TimeDataTests.java index 334871d01a..ee6daaee60 100755 --- a/src/test/java/org/javarosa/core/model/data/test/TimeDataTests.java +++ b/src/test/java/org/javarosa/core/model/data/test/TimeDataTests.java @@ -1,6 +1,7 @@ package org.javarosa.core.model.data.test; import org.javarosa.core.model.data.TimeData; +import org.javarosa.core.model.data.UncastData; import org.junit.BeforeClass; import org.junit.Test; @@ -66,4 +67,10 @@ public void testNullData() { assertTrue("TimeData failed to throw an exception when setting null data", exceptionThrown); assertTrue("TimeData overwrote existing value on incorrect input", data.getValue().equals(now)); } + + @Test + public void testIdentity() { + TimeData data = new TimeData().cast(new UncastData("10:00")); + assertEquals("10:00", data.getDisplayText()); + } } From 5abf66081bdb283fbb922a5d91897a23f32fc15e Mon Sep 17 00:00:00 2001 From: Clayton Sims Date: Wed, 28 Oct 2020 14:52:37 -0400 Subject: [PATCH 2/2] Broader coverage for in/out of timezoneless time --- src/main/java/org/javarosa/core/model/data/TimeData.java | 2 +- src/main/java/org/javarosa/core/model/utils/DateUtils.java | 6 +++++- .../org/javarosa/xform/util/XFormAnswerDataSerializer.java | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/javarosa/core/model/data/TimeData.java b/src/main/java/org/javarosa/core/model/data/TimeData.java index b2b7f65f30..b4407d2b86 100755 --- a/src/main/java/org/javarosa/core/model/data/TimeData.java +++ b/src/main/java/org/javarosa/core/model/data/TimeData.java @@ -82,7 +82,7 @@ public UncastData uncast() { @Override public TimeData cast(UncastData data) throws IllegalArgumentException { - Date ret = DateUtils.parseTime(data.value); + Date ret = DateUtils.parseTime(data.value, true); if (ret != null) { return new TimeData(ret); } diff --git a/src/main/java/org/javarosa/core/model/utils/DateUtils.java b/src/main/java/org/javarosa/core/model/utils/DateUtils.java index 4a2729d435..6ca973d3bb 100755 --- a/src/main/java/org/javarosa/core/model/utils/DateUtils.java +++ b/src/main/java/org/javarosa/core/model/utils/DateUtils.java @@ -509,7 +509,11 @@ private static boolean parseDateAndStore(String dateStr, DateFields df) { } public static Date parseTime(String str) { - if (timezoneOffset() != -1 && !str.contains("+") && !str.contains("-") && !str.contains("Z")) { + return parseTime(str, false); + } + + public static Date parseTime(String str, boolean ignoreTimezone) { + if (!ignoreTimezone && (timezoneOffset() != -1 && !str.contains("+") && !str.contains("-") && !str.contains("Z"))) { str = str + getOffsetInStandardFormat(timezoneOffset()); } diff --git a/src/main/java/org/javarosa/xform/util/XFormAnswerDataSerializer.java b/src/main/java/org/javarosa/xform/util/XFormAnswerDataSerializer.java index fc1c8f9f95..c88c075cfd 100755 --- a/src/main/java/org/javarosa/xform/util/XFormAnswerDataSerializer.java +++ b/src/main/java/org/javarosa/xform/util/XFormAnswerDataSerializer.java @@ -105,7 +105,7 @@ public Object serializeAnswerData(DateTimeData data) { * formatting */ public Object serializeAnswerData(TimeData data) { - return DateUtils.formatTime((Date)data.getValue(), DateUtils.FORMAT_ISO8601); + return DateUtils.formatTime((Date)data.getValue(), DateUtils.FORMAT_ISO8601_WALL_TIME); } /**