[英]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.