diff options
Diffstat (limited to 'spring-context/src/main/java/org/springframework/format/datetime/standard')
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 |