如何将yyyy-MM-dd格式的Java短日期字符串转换为ZonedDateTime
报错根因
ZonedDateTime.parse()要求输入字符串必须包含完整的时间信息,你传入的2021-10-05仅包含日期字段,缺失时、分、秒等时间部分,所以无法直接解析为ZonedDateTime类型。
解决方案1(优先推荐,写法更简洁)
先将日期字符串解析为LocalDate,再通过内置方法补全默认时间并关联时区:
public static final ZoneId ZONE_ID = ZoneId.of("UTC"); // 你的日期字符串 String date = "2021-10-05"; ZonedDateTime dt2 = LocalDate.parse(date) // 自动补00:00:00并关联指定时区 .atStartOfDay(ZONE_ID);
解决方案2(通过DateTimeFormatter配置默认值)
如果需要保留ZonedDateTime.parse()直接解析的写法,可以通过DateTimeFormatterBuilder为缺失的时间字段设置默认值:
import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; public static final ZoneId ZONE_ID = ZoneId.of("UTC"); public static final DateTimeFormatter DATE_ONLY_FORMATTER = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd") // 为缺失的时间部分设置默认值 .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) .toFormatter() .withZone(ZONE_ID); // 使用示例 String date = "2021-10-05"; ZonedDateTime dt2 = ZonedDateTime.parse(date, DATE_ONLY_FORMATTER);
内容的提问来源于stack exchange,提问作者TtT
相关产品推荐
相关产品推荐

