我有一个用例,我有以下格式的日期,
无论输入格式如何,我都需要将其转换为
dd-mm-yyyy
格式。在 JDK11 中转换它的最佳方法是什么?我尝试了不同的图书馆,但没有运气。
您可以迭代已知格式并跳过那些抛出
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;
}