【问题标题】:How to format date in java 8? [duplicate]如何在 java 8 中格式化日期? [复制]
【发布时间】:2020-11-10 14:20:49
【问题描述】:

我必须编写一个函数来接受不同格式字符串的日期列表,并返回相同格式的 Stringdates 列表。我尝试了以下代码,但有些日期无法解析。请帮助我获得正确的输出。

 public static void main(String[] args) {
        List<String> dateList = new ArrayList<>();
        dateList.add("2010/03/30");
        dateList.add("15/12/2016");
        dateList.add("11-15-2012");
        dateList.add("20130720");
       changeDates(dateList);
    }

  public static List<String> changeDates(List<String> dates){
        List<String> returnedData = new ArrayList<>();

        dates.forEach(parsedDate ->{
            try {
                Date date1=new SimpleDateFormat("dd/MM/yyyy").parse(parsedDate);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                String yyyyMMdd = sdf.format(date1);
                System.out.println(yyyyMMdd);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        });

        return returnedData;
    }

输出应该是这样的["20100330","15122016","11152012","20130720"]

谢谢,

【问题讨论】:

  • 解析前检查输入格式
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter
  • 你想如何解释“10-11-2020”?作为“MM-dd-yyyy”还是“dd-MM-yyyy”?

标签: java date time localdate


【解决方案1】:

您无法神奇地自动读取所有可能的日期格式。您必须选择一些您支持的格式。

当您选择了一组要支持的格式后,您可以在每个日期尝试每种格式。当您找到一个在输入上没有失败的解析器时,您就使用那个解析器。 不过要小心。例如,您最终可能会遇到这样一种情况:将月份中的某天解析为月份(例如,理论上 01-02-2020 可以解释为 2020 年 2 月 1 日和 2020 年 1 月 2 日)。

我认为以下代码适用于 Java 9 及更高版本。请注意,我使用的是 java.time 库,而不是旧的 java.util.Date

// These seemed to be the formats you used in your example. 
// "MM-dd-yyyy" is pretty weird I must say though.
private static final List<DateTimeFormatter> SUPPORTED_FORMATS = Arrays.asList(
        DateTimeFormatter.ofPattern("yyyy/MM/dd"),
        DateTimeFormatter.ofPattern("dd/MM/yyyy"),
        DateTimeFormatter.ofPattern("MM-dd-yyyy"),
        DateTimeFormatter.ofPattern("yyyyMMdd"));

private static final DateTimeFormatter OUTPUT_FORMAT = 
        DateTimeFormatter.ofPattern("yyyyMMdd");

public static Optional<LocalDate> tryParse(DateTimeFormatter formatter, String date) {
    try {
        return Optional.of(LocalDate.parse(date, formatter));
    } catch (DateTimeParseException e) {
        return Optional.empty();
    }
}

public static LocalDate parseSupportedDate(String date) {
    return SUPPORTED_FORMATS.stream()
            .flatMap(formatter -> tryParse(formatter, date).stream())
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("Could not parse date " + date));
}

public static List<String> changeDates(List<String> dates) {
    return dates.stream()
            .map(date -> parseSupportedDate(date))
            .map(OUTPUT_FORMAT::format)
            .collect(Collectors.toList());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2012-06-18
    • 2013-07-10
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多