簡體   English   中英

Java8解析給定字符串的日期或日期時間格式

[英]Java8 parse date or date time format for a given string

我有一個文件可以具有日期修改值,具有日期或日期時間的格式。 我曾經將值解析為:

String t = "2012-01-05T21:21:52.834Z";
logger.info(ZonedDateTime.parse(t).toEpochSecond() * 1000);

現在,字符串也可以

t = "2012-01-05";

哪個引起了錯誤

線程“main”中的異常java.time.format.DateTimeParseException:無法在java.time.format.DateTimeFormatter.parseResolved0(未知來源)的索引10處解析文本“2012-01-05”

如果我用這個字符串( 參考

LocalDate date = LocalDate.parse(t, DateTimeFormatter.ISO_DATE);
logger.info(date.atStartOfDay(ZoneId.of("UTC")).toEpochSecond() * 1000);

這會奏效。 但是,正如我已經提到的那樣,字符串可以是這些類型中的任何一種,我如何識別格式然后相應地得到毫秒?

可能的解決方案是使用具有默認值的可選模式。 使用DateTimeFormatterBuilder ,您可以將所需模式與時間部分附加在可選部分中,即由[...]包圍。 在沒有字段的情況下,我們通過將它們設置為0來提供默認值OFFSET_SECONDS字段為0表示沒有與UTC的偏移。

public static void main(String[] args) {
    String[] dates = { "2012-01-05T21:21:52.834Z", "2012-01-05" };

    DateTimeFormatter formatter = 
        new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd['T'HH:mm:ss.SSSz]")
                                      .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                      .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                                      .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                                      .parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
                                      .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
                                      .toFormatter();
    for (String date : dates) {
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, formatter);
        System.out.println(zonedDateTime.toEpochSecond() * 1000);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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