Как получить предыдущие 7 дат с определенной даты в Java? Я получаю 7 дат с текущей даты, но я хочу с определенной даты

//explain
public class DateLoop {
    static String finalDate; 
    static String particularDate;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        SimpleDateFormat sdf = new SimpleDateFormat("d-M-yyyy ");
        Calendar cal = Calendar.getInstance();
        particularDate = "2-1-2018";
        // get starting date
        cal.add(Calendar.DAY_OF_YEAR, -7);

        // loop adding one day in each iteration
        for(int i = 0; i< 7; i++){
            cal.add(Calendar.DAY_OF_YEAR, 1);
            finalDate =sdf.format(cal.getTime());
            System.out.println(finalDate);
            //ie, its giving previous 7 dates from present date, but I want
            //particular date... thanks in advance
        }
    }

}

то есть, он дает предыдущие 7 дат от текущей даты, но я хочу предыдущие 7 дат от конкретной даты.

3 ответа

ТЛ; др

LocalDate.of( 2018 , Month.JANUARY , 23 )
         .minusDays( … )

java.time

Вы используете проблемные старые классы даты и времени, которые теперь унаследованы, заменены классами java.time.

использование LocalDate только для даты без времени суток.

С использованием Month ENUM.

LocalDate start = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;  // 2018-01-23.

Используя номера месяцев, 1-12 для января-декабря.

LocalDate start = LocalDate.of( 2018 , 1 , 23 ) ;  // 2018-01-23.

Соберите последовательность дат.

List<LocalDate> dates = new ArrayList<>( 7 ) ;
for( int i = 1 ; i <= 7 ; i ++ ) {
    LocalDate ld = start.minusDays( i ) ;  // Determine previous date.
    dates.add( ld ) ;  // Add that date object to the list. 
}

Для более ранних версий Android используйте проекты ThreeTen- Backport и ThreeTenABP.

Как уже говорили Ута Александру и Бэзил Бурк, не используйте давно устаревшие классы SimpleDateFormat а также Calendar, java.timeсовременный API даты и времени Java, также известный как JSR-310, гораздо приятнее работать:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d-M-uuuu");
    LocalDate date = LocalDate.parse("2-1-2018", dtf)
            .minusDays(7);

    for(int i = 0; i < 7; i++) {
        date = date.plusDays(1);
        String finalDate = date.format(dtf);
        System.out.println(finalDate);
    }

Это печатает:

27-12-2017
28-12-2017
29-12-2017
30-12-2017
31-12-2017
1-1-2018
2-1-2018

Код не только немного проще и короче, но, что более важно, он более понятный и более естественный для чтения.

Вопрос: Могу ли я использовать java.time на андроид?

Вы, конечно, можете. Это просто требует как минимум Java 6.

  • В Java 8 и более поздних версиях новый API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310).
  • На Android используйте Android-версию ThreeTen Backport. Это называется ThreeTenABP.

связи

Если вы хотите получить какую-то дату из некоторых данных, сделайте что-то вроде ниже.

public void dateFromRandomDate(String date){
    SimpleDateFormat formatter2=new SimpleDateFormat("dd-MMM-yyyy");  
    Date date2=formatter2.parse(date); 
    Calendar calendar = Calendar.getInstance();
    //this sets the date to given date
    calendar.calendar.setTime(date2);
    //now call getTime() or add ,subtract date from here
    //this will add 1 year to given one,similarlly others will work.
    calendar.add(Calendar.YEAR,1);
}
Другие вопросы по тегам