有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java8中格式化日期?

我必须编写一个函数来接受不同格式字符串中的日期列表,并返回相同格式的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”]

谢谢


共 (1) 个答案

  1. # 1 楼答案

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

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

    我认为以下代码适用于Java9及以上版本。注意,我使用的是java。时间库,而不是旧的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());
    }