[英]Generic date and time parsing in java 8
我最近尝试使用 java 8 time API 制作一个通用的日期和时间解析方法,主要用于使用Date
与旧代码交互。
我想做这样的事情:
public static Date parse(String dateStr, String pattern) {
return Date.from(Instant.parse(dateStr, DateTimeFormatter.ofPattern(pattern)));
}
问题在于,对于时间 API,要使用的类取决于模式DateTimeFormatter.parse
永远不会失败,但会返回一个TemporalAccessor
,它很难使用并转换为可用的类。
如果模式没有像“dd/MM/yyyy”这样的时间信息, LocalDateTime.parse
将失败。 如果模式与预期的类不匹配,其他类如Instant
、 ZonedDateTime
等都将无法解析。
理想情况下,我想要一种轻松解析并返回 Instant 的方法,其中缺少字段的默认值,但我找不到这样做的方法。
任何想法?
您可以使用DateTimeFormatterBuilder::parseDefaulting
设置默认值。
var now = ZonedDateTime.now();
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern(pattern)
.parseDefaulting(ChronoField.OFFSET_SECONDS, now.getOffset().getTotalSeconds())
.parseDefaulting(ChronoField.YEAR, now.getYear())
.parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue())
.parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth())
.parseDefaulting(ChronoField.HOUR_OF_DAY, now.getHour())
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, now.getMinute())
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, now.getSecond())
.toFormatter(Locale.ROOT);
Instant dt = Instant.from(formatter.parse(str));
请注意,首先使用appendPattern
附加模式很重要,然后使用parseDefaulting
设置所有默认值。
另请注意,我使用当前时间戳来填充默认值。 因此,例如,如果您遗漏了年份,则需要当前年份(撰写本文时为 2022 年)。 当然,默认值取决于您的确切用例。
例子:
在撰写本文时,它是2022-06-09T17:18:36+02:00 。
System.out.println(parse("9-6", "d-M"));
System.out.println(parse("2023", "uuuu"));
System.out.println(parse("10:13", "H:m"));
System.out.println(parse("25 Dec, 16:22", "d MMM, H:mm"));
解决为
2022-06-09T15:18:36Z
2023-06-09T15:18:36Z
2022-06-09T08:13:36Z
2022-12-25T14:22:36Z
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.