Skip to content

Commit e1a5aa2

Browse files
authored
Date-time validation fails depending on local time zone (#363)
* Add test for date-time validation on daylight savings time * Fix locale-dependent validation of date-time
1 parent 0ec1133 commit e1a5aa2

File tree

4 files changed

+54
-0
lines changed

4 files changed

+54
-0
lines changed

src/main/java/com/networknt/schema/DateTimeValidator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Collections;
2626
import java.util.LinkedHashSet;
2727
import java.util.Set;
28+
import java.util.TimeZone;
2829
import java.util.regex.Matcher;
2930
import java.util.regex.Pattern;
3031

@@ -136,6 +137,7 @@ private boolean isLegalDateTime(String string) {
136137
private boolean validateDateTime(String dateTime, String pattern) {
137138
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
138139
sdf.setLenient(false);
140+
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
139141
return sdf.parse(dateTime, new ParsePosition(0)) != null;
140142
}
141143
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.networknt.schema;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import org.junit.Assert;
6+
import org.junit.Test;
7+
8+
import java.io.InputStream;
9+
import java.util.Set;
10+
11+
public class DateTimeDSTTest {
12+
protected JsonSchema getJsonSchemaFromStreamContentV7(InputStream schemaContent) {
13+
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7);
14+
return factory.getSchema(schemaContent);
15+
}
16+
17+
protected JsonNode getJsonNodeFromStreamContent(InputStream content) throws Exception {
18+
ObjectMapper mapper = new ObjectMapper();
19+
JsonNode node = mapper.readTree(content);
20+
return node;
21+
}
22+
23+
@Test
24+
public void shouldWorkV7() throws Exception {
25+
String schemaPath = "/schema/dateTimeArray.json";
26+
String dataPath = "/data/dstTimes.json"; // Contains 2020 DST changes for various countries
27+
InputStream schemaInputStream = getClass().getResourceAsStream(schemaPath);
28+
JsonSchema schema = getJsonSchemaFromStreamContentV7(schemaInputStream);
29+
InputStream dataInputStream = getClass().getResourceAsStream(dataPath);
30+
JsonNode node = getJsonNodeFromStreamContent(dataInputStream);
31+
Set<ValidationMessage> errors = schema.validate(node);
32+
Assert.assertEquals(0, errors.size());
33+
}
34+
}

src/test/resources/data/dstTimes.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
"2020-03-29T02:00:00Z",
3+
"2020-09-27T02:00:00Z",
4+
"2020-03-15T02:00:00Z",
5+
"2020-03-08T02:00:00Z",
6+
"2020-03-27T02:00:00Z",
7+
"2020-08-04T02:00:00Z"
8+
]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"$id": "https://example.com/dateTimeTest.schema.json",
3+
"$schema": "http://json-schema.org/draft-07/schema#",
4+
"type": "array",
5+
"items": {
6+
"type": "string",
7+
"format": "date-time"
8+
}
9+
}
10+

0 commit comments

Comments
 (0)