Как отформатировать дату в Java 8?

Мне нужно написать функцию, которая принимает список дат, которые находятся в разных форматированных строках, и возвращает список 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]

Спасибо,


person dasun_001    schedule 10.11.2020    source источник
comment
проверьте формат ввода перед разбором   -  person fantaghirocco came to Rome    schedule 10.11.2020
comment
Я рекомендую вам не использовать SimpleDateFormat и Date. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDate и DateTimeFormatter из java.time, современного API даты и времени Java.   -  person Ole V.V.    schedule 10.11.2020
comment
Как вы хотите интерпретировать 10-11-2020? Как ММ-дд-гггг или как дд-ММ-гггг?   -  person Meno Hochschild    schedule 11.11.2020


Ответы (1)


Вы не можете волшебным образом прочитать все возможные форматы даты автоматически. Вы должны выбрать некоторые форматы, которые вы поддерживаете.

Когда вы выбрали набор форматов для поддержки, вы можете попробовать каждый из них на каждой дате. Когда вы найдете синтаксический анализатор, который не дает сбоев на входе, вы используете его. Однако будьте осторожны с этим. Вы можете оказаться в ситуации, когда вы, например, анализируете день месяца как месяц (например, 01-02-2020 теоретически можно интерпретировать как 1 февраля и 2 января 2020 года).

Я думаю, что следующий код работает с 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());
}
person marstran    schedule 10.11.2020