Как получить предыдущие 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.
связи
- Учебник Oracle: Дата и время, объясняя, как использовать
java.time
, - Проект ThreeTen Backport
- ThreeTenABP, Android-версия ThreeTen Backport
- Вопрос: Как использовать ThreeTenABP в Android Project, с очень подробным объяснением.
- Запрос спецификации Java (JSR) 310, где впервые описан современный API даты и времени.
Если вы хотите получить какую-то дату из некоторых данных, сделайте что-то вроде ниже.
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);
}