summaryrefslogtreecommitdiff
path: root/spring-context/src/main/java/org/springframework/format/datetime/standard
diff options
context:
space:
mode:
Diffstat (limited to 'spring-context/src/main/java/org/springframework/format/datetime/standard')
-rw-r--r--spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java9
-rw-r--r--spring-context/src/main/java/org/springframework/format/datetime/standard/InstantFormatter.java18
2 files changed, 22 insertions, 5 deletions
diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java
index ca895d85..fb4f50b3 100644
--- a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java
+++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2014 the original author or authors.
+ * Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ package org.springframework.format.datetime.standard;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
+import java.time.format.ResolverStyle;
import java.util.TimeZone;
import org.springframework.format.annotation.DateTimeFormat.ISO;
@@ -174,7 +175,11 @@ public class DateTimeFormatterFactory {
public DateTimeFormatter createDateTimeFormatter(DateTimeFormatter fallbackFormatter) {
DateTimeFormatter dateTimeFormatter = null;
if (StringUtils.hasLength(this.pattern)) {
- dateTimeFormatter = DateTimeFormatter.ofPattern(this.pattern);
+ // Using strict parsing to align with Joda-Time and standard DateFormat behavior:
+ // otherwise, an overflow like e.g. Feb 29 for a non-leap-year wouldn't get rejected.
+ // However, with strict parsing, a year digit needs to be specified as 'u'...
+ String patternToUse = this.pattern.replace("yy", "uu");
+ dateTimeFormatter = DateTimeFormatter.ofPattern(patternToUse).withResolverStyle(ResolverStyle.STRICT);
}
else if (this.iso != null && this.iso != ISO.NONE) {
switch (this.iso) {
diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/InstantFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/InstantFormatter.java
index ee8d039a..9063f82d 100644
--- a/spring-context/src/main/java/org/springframework/format/datetime/standard/InstantFormatter.java
+++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/InstantFormatter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2014 the original author or authors.
+ * Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ package org.springframework.format.datetime.standard;
import java.text.ParseException;
import java.time.Instant;
+import java.time.format.DateTimeFormatter;
import java.util.Locale;
import org.springframework.format.Formatter;
@@ -26,18 +27,29 @@ import org.springframework.lang.UsesJava8;
/**
* {@link Formatter} implementation for a JSR-310 {@link java.time.Instant},
* following JSR-310's parsing rules for an Instant (that is, not using a
- * configurable {@link java.time.format.DateTimeFormatter}).
+ * configurable {@link java.time.format.DateTimeFormatter}): accepting the
+ * default {@code ISO_INSTANT} format as well as {@code RFC_1123_DATE_TIME}
+ * (which is commonly used for HTTP date header values), as of Spring 4.3.
*
* @author Juergen Hoeller
* @since 4.0
* @see java.time.Instant#parse
+ * @see java.time.format.DateTimeFormatter#ISO_INSTANT
+ * @see java.time.format.DateTimeFormatter#RFC_1123_DATE_TIME
*/
@UsesJava8
public class InstantFormatter implements Formatter<Instant> {
@Override
public Instant parse(String text, Locale locale) throws ParseException {
- return Instant.parse(text);
+ if (text.length() > 0 && Character.isDigit(text.charAt(0))) {
+ // assuming UTC instant a la "2007-12-03T10:15:30.00Z"
+ return Instant.parse(text);
+ }
+ else {
+ // assuming RFC-1123 value a la "Tue, 3 Jun 2008 11:05:30 GMT"
+ return Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(text));
+ }
}
@Override