Java 中不同格式的日期格式化

问题描述 投票:0回答:1

我有一个用例,我有以下格式的日期,

  1. 2023-05-09T05:55:07Z
  2. 2023-04-30
  3. 08-05-2023
  4. 2023-05-09 00:00:00
  5. 2021 年 12 月 31 日

无论输入格式如何,我都需要将其转换为

dd-mm-yyyy
格式。在 JDK11 中转换它的最佳方法是什么?我尝试了不同的图书馆,但没有运气。

java java-11 simpledateformat date-format datetimeformatter
1个回答
0
投票

您可以迭代已知格式并跳过那些抛出

DateTimeParseException
.

的格式

注意: 如果您只是将日期字符串解析为

LocalDateTime
,则需要构建格式化程序并指定时间部分是可选的。

import java.time.LocalDateTime;
import java.time.format.*;
import java.time.temporal.ChronoField;
import java.util.*;

public class DateParser {
    public static void main(String[] args) {
        System.out.println(normalizeDate("2023-05-09T05:55:07Z")); // 2023-05-09
        System.out.println(normalizeDate("2023-04-30")); // 2023-04-30
        System.out.println(normalizeDate("08-05-2023")); // 2023-08-05
        System.out.println(normalizeDate("2023-05-09 00:00:00")); // 2023-05-09
        System.out.println(normalizeDate("31-Dec-2021")); // 2021-12-31
        System.out.println(normalizeDate("")); // null
    }

    public static String normalizeDate(String rawDateTimeString) {
        return Optional.ofNullable(parseDateString(rawDateTimeString))
                .map(displayFormat::format)
                .orElse(null);
    }

    private static LocalDateTime parseDateString(String dateString) {
        for (DateTimeFormatter formatter : knownFormats) {
            try {
                return LocalDateTime.parse(dateString, formatter);
            } catch (DateTimeParseException e) {
                continue;
            }
        }
        return null;
    }

    private static final List<DateTimeFormatter> knownFormats = Arrays.asList(
            DateTimeFormatter.ISO_DATE_TIME,
            // Credit: https://stackoverflow.com/a/40175568/1762224
            new DateTimeFormatterBuilder()
                    .appendPattern("yyyy-MM-dd")
                    .optionalStart()
                    .appendPattern(" HH:mm")
                    .optionalEnd()
                    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                    .toFormatter(),
            new DateTimeFormatterBuilder()
                    .appendPattern("MM-dd-yyyy")
                    .optionalStart()
                    .appendPattern(" HH:mm")
                    .optionalEnd()
                    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                    .toFormatter(),
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
            new DateTimeFormatterBuilder()
                    .appendPattern("dd-MMM-yyyy")
                    .optionalStart()
                    .appendPattern(" HH:mm")
                    .optionalEnd()
                    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                    .toFormatter());

    private static final DateTimeFormatter displayFormat = DateTimeFormatter.ISO_DATE;
}
© www.soinside.com 2019 - 2024. All rights reserved.