|
|
@@ -3,6 +3,7 @@ package net.ranides.assira.time.format;
|
|
|
import lombok.AccessLevel;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.Getter;
|
|
|
+import net.ranides.assira.collection.lists.ListUtils;
|
|
|
import net.ranides.assira.generic.ValueUtils;
|
|
|
import net.ranides.assira.time.DateTimeUtils;
|
|
|
import net.ranides.assira.time.ZonedDate;
|
|
|
@@ -24,7 +25,9 @@ import java.time.format.SignStyle;
|
|
|
import java.time.temporal.ChronoField;
|
|
|
import java.time.temporal.TemporalAccessor;
|
|
|
import java.time.temporal.TemporalQueries;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
import java.util.Locale;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
@@ -39,7 +42,7 @@ import static java.time.temporal.ChronoField.YEAR;
|
|
|
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
|
|
public class DateTimeReader {
|
|
|
|
|
|
- private static final DateTimeFormatter ECMA_PARSER;
|
|
|
+ static final DateTimeFormatter ECMA_PARSER;
|
|
|
static {
|
|
|
Map<Long, String> dow = new HashMap<>();
|
|
|
dow.put(1L, "Mon");
|
|
|
@@ -87,7 +90,7 @@ public class DateTimeReader {
|
|
|
.toFormatter();
|
|
|
}
|
|
|
|
|
|
- private static final DateTimeFormatter DATETIME_PARSER = new DateTimeFormatterBuilder()
|
|
|
+ static final DateTimeFormatter DATETIME_PARSER = new DateTimeFormatterBuilder()
|
|
|
.parseCaseInsensitive()
|
|
|
.append(DateTimeFormatter.ISO_LOCAL_DATE)
|
|
|
.appendLiteral('T')
|
|
|
@@ -103,7 +106,7 @@ public class DateTimeReader {
|
|
|
.optionalEnd()
|
|
|
.toFormatter();
|
|
|
|
|
|
- private static final DateTimeFormatter DATE_PARSER = new DateTimeFormatterBuilder()
|
|
|
+ static final DateTimeFormatter DATE_PARSER = new DateTimeFormatterBuilder()
|
|
|
.parseCaseInsensitive()
|
|
|
.append(DateTimeFormatter.ISO_LOCAL_DATE)
|
|
|
.optionalStart() // time is optional
|
|
|
@@ -121,7 +124,7 @@ public class DateTimeReader {
|
|
|
.optionalEnd()
|
|
|
.toFormatter();
|
|
|
|
|
|
- public static final DateTimeFormatter TIME_PARSER = new DateTimeFormatterBuilder()
|
|
|
+ static final DateTimeFormatter TIME_PARSER = new DateTimeFormatterBuilder()
|
|
|
.parseCaseInsensitive()
|
|
|
.optionalStart() // date is optional
|
|
|
.append(DateTimeFormatter.ISO_LOCAL_DATE)
|
|
|
@@ -143,7 +146,7 @@ public class DateTimeReader {
|
|
|
|
|
|
public static final DateTimeReader RFC = new DateTimeReader(DateTimeFormatter.RFC_1123_DATE_TIME);
|
|
|
|
|
|
- public static final DateTimeReader ECMA262 = new DateTimeReader(ECMA_PARSER).withParseAll(false);
|
|
|
+ public static final DateTimeReader ECMA262 = new DateTimeReader(ECMA_PARSER).withStrictMode(false);
|
|
|
|
|
|
public static final DateTimeReader DATETIME = new DateTimeReader(DATETIME_PARSER);
|
|
|
|
|
|
@@ -161,41 +164,25 @@ public class DateTimeReader {
|
|
|
@Getter
|
|
|
private final ZoneId targetZone;
|
|
|
|
|
|
- private final boolean parseAll;
|
|
|
+ private final boolean strictMode;
|
|
|
|
|
|
public static DateTimeReader of(String... list) {
|
|
|
- return of(0, list);
|
|
|
+ return of(ListUtils.map(Arrays.asList(list), DateTimeReader::new));
|
|
|
}
|
|
|
|
|
|
public static DateTimeReader of(DateTimeFormatter... list) {
|
|
|
- return of(0, list);
|
|
|
+ return of(ListUtils.map(Arrays.asList(list), DateTimeReader::new));
|
|
|
}
|
|
|
|
|
|
public static DateTimeReader of(DateTimeReader... list) {
|
|
|
- return of(0, list);
|
|
|
+ return of(Arrays.asList(list));
|
|
|
}
|
|
|
|
|
|
- private static DateTimeReader of(int offset, DateTimeReader... list) {
|
|
|
- if(offset == list.length - 1) {
|
|
|
- return list[offset];
|
|
|
+ private static DateTimeReader of(List<DateTimeReader> list) {
|
|
|
+ if(list.size() == 1) {
|
|
|
+ return list.get(0);
|
|
|
} else {
|
|
|
- return list[offset].withFallback(of(offset + 1, list));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private static DateTimeReader of(int offset, DateTimeFormatter... list) {
|
|
|
- if(offset == list.length - 1) {
|
|
|
- return new DateTimeReader(list[offset]);
|
|
|
- } else {
|
|
|
- return new DateTimeReader(list[offset]).withFallback(of(offset + 1, list));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private static DateTimeReader of(int offset, String... list) {
|
|
|
- if(offset == list.length - 1) {
|
|
|
- return new DateTimeReader(list[offset]);
|
|
|
- } else {
|
|
|
- return new DateTimeReader(list[offset]).withFallback(of(offset + 1, list));
|
|
|
+ return list.get(0).withFallback(of(list.subList(1, list.size())));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -208,7 +195,7 @@ public class DateTimeReader {
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withFallback(DateTimeReader fallback) {
|
|
|
- return new DateTimeReader(fallback, parser, sourceZone, targetZone, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser, sourceZone, targetZone, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withFormat(String newFormat) {
|
|
|
@@ -216,11 +203,11 @@ public class DateTimeReader {
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withFormat(DateTimeFormatter newFormat) {
|
|
|
- return new DateTimeReader(fallback, newFormat, sourceZone, targetZone, parseAll);
|
|
|
+ return new DateTimeReader(fallback, newFormat, sourceZone, targetZone, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withLocale(Locale newLocale) {
|
|
|
- return new DateTimeReader(fallback, parser.withLocale(newLocale), sourceZone, targetZone, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser.withLocale(newLocale), sourceZone, targetZone, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withLocale(String newLocale) {
|
|
|
@@ -232,7 +219,7 @@ public class DateTimeReader {
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withZone(ZoneId newZone) {
|
|
|
- return new DateTimeReader(fallback, parser, newZone, newZone, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser, newZone, newZone, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withZone(String newZone) {
|
|
|
@@ -240,11 +227,11 @@ public class DateTimeReader {
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withoutZone() {
|
|
|
- return new DateTimeReader(fallback, parser, null, null, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser, null, null, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withSourceZone(ZoneId newZone) {
|
|
|
- return new DateTimeReader(fallback, parser, newZone, targetZone, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser, newZone, targetZone, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withSourceZone(String newZone) {
|
|
|
@@ -252,11 +239,11 @@ public class DateTimeReader {
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withoutSourceZone() {
|
|
|
- return new DateTimeReader(fallback, parser, null, targetZone, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser, null, targetZone, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withTargetZone(ZoneId newZone) {
|
|
|
- return new DateTimeReader(fallback, parser, sourceZone, newZone, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser, sourceZone, newZone, strictMode);
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withTargetZone(String newZone) {
|
|
|
@@ -264,11 +251,11 @@ public class DateTimeReader {
|
|
|
}
|
|
|
|
|
|
public DateTimeReader withoutTargetZone() {
|
|
|
- return new DateTimeReader(fallback, parser, sourceZone, null, parseAll);
|
|
|
+ return new DateTimeReader(fallback, parser, sourceZone, null, strictMode);
|
|
|
}
|
|
|
|
|
|
- DateTimeReader withParseAll(boolean newParseAll) {
|
|
|
- return new DateTimeReader(fallback, parser, sourceZone, targetZone, newParseAll);
|
|
|
+ DateTimeReader withStrictMode(boolean newMode) {
|
|
|
+ return new DateTimeReader(fallback, parser, sourceZone, targetZone, newMode);
|
|
|
}
|
|
|
|
|
|
public ZonedDateTime parse(String input) {
|
|
|
@@ -315,7 +302,7 @@ public class DateTimeReader {
|
|
|
|
|
|
@NotNull
|
|
|
private TemporalAccessor parse0(String input) {
|
|
|
- return parseAll ? parser.parse(input) : parser.parse(input, new ParsePosition(0));
|
|
|
+ return strictMode ? parser.parse(input) : parser.parse(input, new ParsePosition(0));
|
|
|
}
|
|
|
|
|
|
|