Получить список строковых дат между заданным диапазоном дат - Scala

Я пытаюсь получить список строковых дат в Scala для заданного диапазона. Есть ли прямой / более короткий способ добиться этого?

val format = "yyyMMdd"
val startDate = "20200101"
val endDate = "20200131"

Ожидаемый результат = Список (2020101,20200102, ....., 20200131)

2 ответа

Да... если вы добавите тире в указанном вами формате, вы можете использовать LocalDataдля анализа даты без использования средства форматирования даты, чтобы усложнить ее. например yyyy-MM-dd

val startDate = LocalDate.parse("2020-01-01")

val endDate = LocalDate.parse("2020-01-31") 

Тогда вы можете использовать java.time.LocalDate.datesUntilчтобы создать для вас даты. После этого нужно выполнить некоторые манипуляции с коллекцией, если вы действительно хотите List и немного Stringманипуляции делать для свидания без тире. Это поможет вам в большинстве случаев.

startDate.datesUntil(endDate).collect(Collectors.toList()).asScala.map(date => date.toString)

List[String] = ArrayBuffer(2020-01-01, 2020-01-02, 2020-01-03, ...).toList

Сделать это можно следующим образом:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Tests
        System.out.println(getDateList("20200101", "20200110"));
        System.out.println(getDateList("20200101", "20200131"));
    }

    static List<String> getDateList(String strStartDate, String strEndDate) {
        // List to be populated with the desired strings
        List<String> result = new ArrayList<>();

        // Formatter for the desired pattern
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");

        // Parse strings to LocalDate instances
        LocalDate startDate = LocalDate.parse(strStartDate, formatter);
        LocalDate endDate = LocalDate.parse(strEndDate, formatter);

        // Loop starting with start date until end date with a step of one day
        for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
            result.add(date.format(formatter));
        }

        // Return the populated list
        return result;
    }
}

Вывод:

[20200101, 20200102, 20200103,..., 20200110]
[20200101, 20200102, 20200103,..., 20200131]

Решение с использованием Java Stream API:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        // Tests
        System.out.println(getDateList("20200101", "20200110"));
        System.out.println(getDateList("20200101", "20200131"));
    }

    static List<String> getDateList(String strStartDate, String strEndDate) {
        // Formatter for the input and desired pattern
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");

        // Parse strings to LocalDate instances
        LocalDate startDate = LocalDate.parse(strStartDate, formatter);
        LocalDate endDate = LocalDate.parse(strEndDate, formatter);

        return Stream.iterate(startDate, date -> date.plusDays(1))
                .limit(ChronoUnit.DAYS.between(startDate, endDate.plusDays(1)))
                .map(date -> date.format(formatter))
                .collect(Collectors.toList());
    }
}
Другие вопросы по тегам