Преобразование строки Java в дату для печати даты 1 года - PullRequest
0 голосов
/ 30 ноября 2018

Код Я должен получить все даты за прошедший год, начиная со строки sDate1.Этот код сейчас ни к чему не приводит, но только что добавил, надеюсь, кто-нибудь может помочь.Есть строка для LocalDateTime, Date to LocalDateTime ошибка, возникающая, которую я не могу решить, и она застряла

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");  
String Date = "20181120";
Date date1=new SimpleDateFormat("yyyyMMdd").parse(sDate1);

LocalDateTime start =LocalDateTime.now();
LocalDateTime end = start.minusYears (1);
List<String> First = new ArrayList<>();
List<String> Second = new ArrayList<>();
List<String> Third = new ArrayList<>();
while (!end.isAfter(start)) {
    First.add(dtf.format(end)+"_*_A.dat");
    Second.add(dtf.format(end)+"_*_B.dat");
    Third.add(dtf.format(end)+"_*_C.dat");
    end = end.plusDays(1);
}

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Stream

Java 9 и более поздние версии добавили метод LocalDate::datesUntil для генерации потока из LocalDate объектов.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ; 
Stream< LocalDate > stream = today.minusYears( 1 ).datesUntil( today ) ;

Цикл по этому потоку.

stream.forEach( ( LocalDate localDate ) -> {
    System.out.println( localDate );
} );

2017-12-01

2017-12-02

2017-12-03

Для получения дополнительной информации о потоках см. Oracle Tutorial и статьи Обработка данных с помощью Java SE 8Потоки, часть 1 и часть 2 .

0 голосов
/ 01 декабря 2018
  1. Я думал, что ваш собственный код был достаточно хорош для ответа.
  2. Я также думал, что предложение Бэзила Бурка о потоке было достаточно хорошим, чтобы его можно было изложить немного подробнее.

Ваш собственный ответ

Код, который вы разместили в комментарии, конечно, не читается.Здесь я отформатировал его (или мой Eclipse):

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    String sDate1 = "20181120";
    LocalDate date1 = LocalDate.parse(sDate1, dtf);
    LocalDate end = date1.plusYears(1);
    ArrayList<String> first = new ArrayList<>();
    ArrayList<String> second = new ArrayList<>();
    ArrayList<String> third = new ArrayList<>();
    while (!date1.isAfter(end)) {
        first.add(dtf.format(date1) + "*_A.dat");
        second.add(dtf.format(date1) + "_B.dat");
        third.add(dtf.format(date1) + "__C.dat");
        date1 = date1.plusDays(1);
    }

    // Let’s also see some of the result
    first.forEach(System.out::println);

Вывод, сокращенно:

20181120*_A.dat
20181121*_A.dat
20181122*_A.dat
20181123*_A.dat
…
20191118*_A.dat
20191119*_A.dat
20191120*_A.dat

Подводя итог изменениям вопроса:

  • Вам нужно было разобрать строку даты, чтобы получить дату начала.Однако для этого не было причин вносить хлопоты и устаревшие SimpleDateFormat.java.time предоставляет всю необходимую нам функциональность.
  • Поскольку нам нужна только дата, а не время суток, также не было причин использовать LocalDateTime.
  • Возможно, вы все еще намеревались_*_ перед каждым из A, B и C, но вы можете это исправить самостоятельно.

Использовать поток

    List<String> first = date1.datesUntil(end.plusDays(1))
            .map(d -> d.format(dtf) + "_*_A.dat")
            .collect(Collectors.toList());

В этомВ этом случае я рекомендую три отдельных потоковых конвейера для трех списков.Так как метод datesUntil принимает исключительную дату окончания, и вы хотите, чтобы ваша дата окончания была включена, нам нужно добавить 1 день.

0 голосов
/ 30 ноября 2018

Не уверен, понял ли я вашу конкретную задачу.Но вот что я бы написал:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");  
String sDate1 = "20181120";
LocalDate date1= LocalDate.parse(sDate1, dtf);

LocalDate start = LocalDate.now();
LocalDate end = start.plusYears(1);
ArrayList<String> first = new ArrayList<>();
ArrayList<String> second = new ArrayList<>();
ArrayList<String> third = new ArrayList<>();
while (!start.isAfter(end)) {
    first.add(dtf.format(start)+"_*_A.dat");
    second.add(dtf.format(start)+"_*_B.dat");
    third.add(dtf.format(start)+"_*_C.dat");
    start = start.plusDays(1);
}
...