Spring 4: @DateTimeFormat with Java 8 Date-Time API
@DateTimeFormat
annotation that was introduced in Spring 3.0 as a part of Formatter SPI can be used to to parse and print localized field values in web applications. In Spring 4.0, @DateTimeFormat
annotation can be used with Java 8 Date-Time API (java.time
) out-of-the-box, without extra effort.
In Spring, field formatting can be configured by field type or annotation. To bind an annotation to a formatter AnnotationFormatterFactory
must be implemented. Spring 4.0 brings Jsr310DateTimeFormatAnnotationFormatterFactory
that formats Java 8 Date-Time fields annotated with the @DateTimeFormat
. Supported field types are as follows:
java.time.LocalDate
java.time.LocalTime
java.time.LocalDateTime
java.time.ZonedDateTime
java.time.OffsetDateTime
java.time.OffsetTime
One can utilize all mentioned types in a form like below:
public class DatesForm { @DateTimeFormat(iso = ISO.DATE) private LocalDate localDate; @DateTimeFormat(iso = ISO.TIME) private LocalTime localTime; @DateTimeFormat(iso = ISO.TIME) private OffsetTime offsetTime; @DateTimeFormat(iso = ISO.DATE_TIME) private LocalDateTime localDateTime; @DateTimeFormat(iso = ISO.DATE_TIME) private ZonedDateTime zonedDateTime; @DateTimeFormat(iso = ISO.DATE_TIME) private OffsetDateTime offsetDateTime; }The form can be passed to the view and Spring will take care of proper formatting of the fields.
While specifying the formatting on the fields of types: java.time.LocalDate
, java.time.LocalTime
, java.time.OffsetTime
you need to remember to properly configure @DateTimeFormat
.
@DateTimeFormat
declares that a field should be formatted as a date time and since java.time.LocalDate
represents a date, and the other two represent time - you will get java.time.temporal.UnsupportedTemporalTypeException
(e.g.: Unsupported field: ClockHourOfAmPm, Unsupported field: MonthOfYear) thrown by java.time.format.DateTimeFormatter
.