From 1daa4d1312f659ab091ad1a51bd750459d0bac3b Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sun, 22 Apr 2018 10:49:22 +0200 Subject: [PATCH 1/2] Fix date parsing. Closes #1564. --- .../google/refine/util/ParsingUtilities.java | 28 ++++++++++++++++--- .../tests/util/ParsingUtilitiesTests.java | 19 ++++++++++++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/main/src/com/google/refine/util/ParsingUtilities.java b/main/src/com/google/refine/util/ParsingUtilities.java index b2f107a21..73bee8d13 100644 --- a/main/src/com/google/refine/util/ParsingUtilities.java +++ b/main/src/com/google/refine/util/ParsingUtilities.java @@ -38,12 +38,14 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; +import java.text.ParseException; import java.time.Instant; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Properties; import javax.servlet.http.HttpServletRequest; @@ -188,13 +190,31 @@ public class ParsingUtilities { * @return LocalDateTime or null if the parse failed */ static public OffsetDateTime stringToDate(String s) { - Instant instant = Instant.parse(s); - return OffsetDateTime.ofInstant(instant, ZoneId.of("Z")); + // Accept timestamps with an explicit time zone + try { + return OffsetDateTime.parse(s); + } catch(DateTimeParseException e) { + + } + + // Also accept timestamps without an explicit zone and + // assume them to be in local time. + try { + LocalDateTime localTime = LocalDateTime.parse(s); + return OffsetDateTime.of(localTime, ZoneId.systemDefault().getRules().getOffset(localTime)); + } catch(DateTimeParseException e) { + + } + return null; } static public LocalDateTime stringToLocalDate(String s) { - Instant instant = Instant.parse(s); - return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); + // parse the string as a date and express it in local time + OffsetDateTime parsed = stringToDate(s); + if (parsed == null) { + return null; + } + return parsed.toLocalDateTime(); } static public String instantToString(Instant instant) { diff --git a/main/tests/server/src/com/google/refine/tests/util/ParsingUtilitiesTests.java b/main/tests/server/src/com/google/refine/tests/util/ParsingUtilitiesTests.java index 91baccd76..9b396ca32 100644 --- a/main/tests/server/src/com/google/refine/tests/util/ParsingUtilitiesTests.java +++ b/main/tests/server/src/com/google/refine/tests/util/ParsingUtilitiesTests.java @@ -105,7 +105,24 @@ public class ParsingUtilitiesTests extends RefineTest { OffsetDateTime zdt = ParsingUtilities.stringToDate(historyEntryDate); String zdtString = ParsingUtilities.dateToString(zdt); Assert.assertEquals(zdtString, historyEntryDate); - + } + + @Test + public void stringToDate() { + Assert.assertEquals(2017, ParsingUtilities.stringToDate("2017-04-03T08:09:43.123").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToDate("2017-04-03T08:09:43").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToDate("2017-04-03T08:09:43Z").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToDate("2017-04-03T08:09:43.123Z").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToDate("2017-04-03T08:09:43+00:00").getYear()); + } + + @Test + public void stringToLocalDate() { + Assert.assertEquals(2017, ParsingUtilities.stringToLocalDate("2017-04-03T08:09:43.123").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToLocalDate("2017-04-03T08:09:43").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToLocalDate("2017-04-03T08:09:43Z").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToLocalDate("2017-04-03T08:09:43.123Z").getYear()); + Assert.assertEquals(2017, ParsingUtilities.stringToLocalDate("2017-04-03T08:09:43+00:00").getYear()); } @Test From c9224b2e062d15d16244e4c315ace7802139b238 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sun, 22 Apr 2018 11:01:14 +0200 Subject: [PATCH 2/2] Fix unused import --- main/src/com/google/refine/util/ParsingUtilities.java | 1 - 1 file changed, 1 deletion(-) diff --git a/main/src/com/google/refine/util/ParsingUtilities.java b/main/src/com/google/refine/util/ParsingUtilities.java index 73bee8d13..123815fb6 100644 --- a/main/src/com/google/refine/util/ParsingUtilities.java +++ b/main/src/com/google/refine/util/ParsingUtilities.java @@ -38,7 +38,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; -import java.text.ParseException; import java.time.Instant; import java.time.LocalDateTime; import java.time.OffsetDateTime;