簡體   English   中英

java 8中的通用日期和時間解析

[英]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將失敗。 如果模式與預期的類不匹配,其他類如InstantZonedDateTime等都將無法解析。

理想情況下,我想要一種輕松解析並返回 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM