我有一个具有java.time.ZonedDateTime
属性的实体。我想将从表单提交的dd/MM/yyyy HH:mm
的字符串解析为java.time.ZonedDateTime
。
我试过@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm")
。但是它只适用于@DateTimeFormat(pattern = "dd/MM/yyyy")
的LocalDate
。
我还创建了一个Converter
,如下所示
public class ZonedDateTimeConverter implements Converter<String, ZonedDateTime> {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
private final ZoneId zoneId;
public ZonedDateTimeConverter(ZoneId zoneId) {
this.zoneId = zoneId;
}
@Override
public ZonedDateTime convert(String source) {
LOG.info("Parsing string {} to ZonedDateTime: {}", source, ZonedDateTime.parse(source, DATE_TIME_FORMATTER));
return ZonedDateTime.parse(source, DATE_TIME_FORMATTER);
}
}
并覆盖webMvcConfiguration,如下所示
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new ZonedDateTimeConverter(ZoneId.systemDefault()));
}
}
我不知道什么是正确的方法来让它工作.使用Sping Boot 1.5.6. Thymeleaf 3.0.7
2条答案
按热度按时间woobm2wo1#
DateTimeFormatter
的模式只有日期(dd/MM/yyyy
)和时间(HH:mm
),但是ZonedDateTime
还需要一个时区才能直接解析。由于输入没有它,一种替代方法是首先将输入解析为
java.time.LocalDateTime
,然后使用已有的zoneId
将其转换为ZoneDateTime
:另一种方法是在格式化程序中设置时区,这样就可以直接解析为
ZonedDateTime
,但在这种情况下,我还建议您进行重构:使格式化程序成为转换器类的一个字段(而不是static
字段),因为它依赖于在构造函数中传递的ZoneId
。关于使用
ZoneId.systemDefault()
需要注意的是,这个方法获取JVM的默认时区,但是请记住it can be changed without notice, even at runtime,所以最好总是指定您要使用的时区。API使用IANA timezones names(格式总是
Continent/City
,如Asia/Kolkata
或Europe/Berlin
),然后使用of
方法创建时区,如ZoneId.of("Asia/Kolkata")
。避免使用3个字母的缩写(如
IST
或PST
),因为它们不明确且不标准。其中一些可能工作(通常是由于向后兼容的原因),但不能保证。您可以使用
ZoneId.getAvailableZoneIds()
获得所有可用时区的列表(并选择最适合您的时区)。tcbh2hod2#
您可以创建一个将自动从String转换为ZonedDateTime字段的配置,如下所示: