Spring 引导解析表单数据到 ZonedDateTime (dd/MM/yyyy HH:mm)
Spring Boot parse form data to ZonedDateTime (dd/MM/yyyy HH:mm)
我有一个实体 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()));
}
}
我不确定让它工作的正确方法是什么。
使用 Spring 启动 1.5.6。百里香 3.0.7
你的DateTimeFormatter
的模式只有日期(dd/MM/yyyy
)和时间(HH:mm
),但是ZonedDateTime
还需要时区,直接解析.
由于输入没有它,一种替代方法是先将输入解析为 java.time.LocalDateTime
,然后使用您使用的 zoneId
将其转换为 ZoneDateTime
已经有:
public ZonedDateTime convert(String source) {
// parse to LocalDateTime
LocalDateTime dt = LocalDateTime.parse(source, DATE_TIME_FORMATTER);
// convert to ZonedDateTime
return dt.atZone(this.zoneId);
}
另一种方法是在格式化程序中设置时区,这样您就可以直接解析为 ZonedDateTime
。但在这种情况下,我还建议您进行重构:使格式化程序成为转换器 class 的一个字段(而不是 static
字段),因为它将取决于您的 ZoneId
传入构造函数。
public class ZonedDateTimeConverter implements Converter<String, ZonedDateTime> {
private final DateTimeFormatter formatter;
public ZonedDateTimeConverter(ZoneId zoneId) {
// set the zone in the formatter
this.formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(zoneId);
}
@Override
public ZonedDateTime convert(String source) {
// now the formatter has a zone set, so I can parse directly to ZonedDateTime
return ZonedDateTime.parse(source, this.formatter);
}
}
关于使用 ZoneId.systemDefault()
的注意事项。此方法获取 JVM 的默认时区,但请记住 ,因此最好始终指定要使用的时区。
API 使用 IANA timezones names(格式总是 Continent/City
,如 Asia/Kolkata
或 Europe/Berlin
)。然后使用 of
方法创建时区,例如 ZoneId.of("Asia/Kolkata")
.
避免使用 3 个字母的缩写(如 IST
或 PST
),因为它们是 ambiguous and not standard。其中一些 可能 有效(通常是由于追溯兼容性原因),但不能保证。
您可以使用 ZoneId.getAvailableZoneIds()
.
获取所有可用时区的列表(并选择最适合您的情况)
我有一个实体 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()));
}
}
我不确定让它工作的正确方法是什么。 使用 Spring 启动 1.5.6。百里香 3.0.7
你的DateTimeFormatter
的模式只有日期(dd/MM/yyyy
)和时间(HH:mm
),但是ZonedDateTime
还需要时区,直接解析.
由于输入没有它,一种替代方法是先将输入解析为 java.time.LocalDateTime
,然后使用您使用的 zoneId
将其转换为 ZoneDateTime
已经有:
public ZonedDateTime convert(String source) {
// parse to LocalDateTime
LocalDateTime dt = LocalDateTime.parse(source, DATE_TIME_FORMATTER);
// convert to ZonedDateTime
return dt.atZone(this.zoneId);
}
另一种方法是在格式化程序中设置时区,这样您就可以直接解析为 ZonedDateTime
。但在这种情况下,我还建议您进行重构:使格式化程序成为转换器 class 的一个字段(而不是 static
字段),因为它将取决于您的 ZoneId
传入构造函数。
public class ZonedDateTimeConverter implements Converter<String, ZonedDateTime> {
private final DateTimeFormatter formatter;
public ZonedDateTimeConverter(ZoneId zoneId) {
// set the zone in the formatter
this.formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(zoneId);
}
@Override
public ZonedDateTime convert(String source) {
// now the formatter has a zone set, so I can parse directly to ZonedDateTime
return ZonedDateTime.parse(source, this.formatter);
}
}
关于使用 ZoneId.systemDefault()
的注意事项。此方法获取 JVM 的默认时区,但请记住
API 使用 IANA timezones names(格式总是 Continent/City
,如 Asia/Kolkata
或 Europe/Berlin
)。然后使用 of
方法创建时区,例如 ZoneId.of("Asia/Kolkata")
.
避免使用 3 个字母的缩写(如 IST
或 PST
),因为它们是 ambiguous and not standard。其中一些 可能 有效(通常是由于追溯兼容性原因),但不能保证。
您可以使用 ZoneId.getAvailableZoneIds()
.