Skip to content

Commit f528267

Browse files
committed
Error evaluating $toMillis('2024-08-27T22:43:15.78133') #47
1 parent 3a92c2b commit f528267

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/main/java/com/dashjoin/jsonata/Functions.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@
3232
import java.text.ParseException;
3333
import java.text.SimpleDateFormat;
3434
import java.time.LocalDate;
35+
import java.time.LocalDateTime;
3536
import java.time.OffsetDateTime;
3637
import java.time.ZoneId;
3738
import java.time.format.DateTimeFormatter;
39+
import java.time.format.DateTimeParseException;
3840
import java.util.ArrayList;
3941
import java.util.Arrays;
4042
import java.util.Base64;
@@ -2224,8 +2226,15 @@ public static Long dateTimeToMillis(String timestamp, String picture) throws Par
22242226
return OffsetDateTime.parse(timestamp).toInstant().toEpochMilli();
22252227
}
22262228
catch (RuntimeException e) {
2227-
LocalDate ldt = LocalDate.parse(timestamp, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
2228-
return ldt.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant().toEpochMilli();
2229+
try {
2230+
LocalDate ldt = LocalDate.parse(timestamp, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
2231+
return ldt.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant().toEpochMilli();
2232+
}
2233+
catch (DateTimeParseException noZone) {
2234+
// Implementations usually default to the local time zone when the date string is non-standard
2235+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#non-standard_date_strings
2236+
return LocalDateTime.parse(timestamp).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
2237+
}
22292238
}
22302239
} else {
22312240
return DateTimeUtils.parseDateTime(timestamp, picture);

src/test/java/com/dashjoin/jsonata/DateTimeTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,13 @@ public void testFormatInteger() {
99
Jsonata expr = Jsonata.jsonata("$toMillis('2018th', '[Y0001;o]')");
1010
Assertions.assertEquals(1514764800000L, expr.evaluate(null));
1111
}
12+
13+
@Test
14+
public void testToMillis() {
15+
String noZoneTooPrecise = "2024-08-27T22:43:15.78133";
16+
Jsonata expr = Jsonata.jsonata("$fromMillis($toMillis($))");
17+
String timestamp = (String) expr.evaluate(noZoneTooPrecise);
18+
Assertions.assertTrue(timestamp.startsWith("2024-08-2"));
19+
Assertions.assertTrue(timestamp.endsWith(":43:15.781Z"));
20+
}
1221
}

0 commit comments

Comments
 (0)