2014-07-22 2 views
3

Извините за извинение за вопрос повторный вопрос ..Итерации между двумя датами, включая дату начала?

public static void main(String[] args)throws Exception { 
    GregorianCalendar gcal = new GregorianCalendar(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM"); 
    Date start = sdf.parse("2010.01"); 
    Date end = sdf.parse("2010.04"); 
    gcal.setTime(start); 
    while (gcal.getTime().before(end)) { 
     gcal.add(Calendar.MONTH, 1); 
     Date d = gcal.getTime(); 
     System.out.println(d); 
    } 
} 

В приведенном выше коде гравюр между датами точно, но мне нужно напечатать дату и начать ..

выше выходной код

Mon Feb 01 00:00:00 IST 2010 
Mon Mar 01 00:00:00 IST 2010 
Thu Apr 01 00:00:00 IST 2010 

Но мне также нужна дата начала моей работы.

, пожалуйста, помогите мне получить это Спасибо в объявлении Вэнс ..

+0

возможно дубликат [Как перебрать диапазон дат в следующем формате 25-12-2012 до 31-12-2012 (дефис должен поддерживаться) в Java?] (http://stackoverflow.com/questions/24877700/how-to-iterate-over-a-date-range-in-the-follow-format-25-12-2012-to -31-12-201) –

ответ

7

По-моему, это самый приятный способ:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM"); 
Date start = sdf.parse("2010.01"); 
Date end = sdf.parse("2010.04"); 

GregorianCalendar gcal = new GregorianCalendar(); 
gcal.setTime(start); 

while (!gcal.getTime().after(end)) { 
    Date d = gcal.getTime(); 
    System.out.println(d); 
    gcal.add(Calendar.MONTH, 1); 
} 

Выход:

Fri Jan 01 00:00:00 WST 2010 
Mon Feb 01 00:00:00 WST 2010 
Mon Mar 01 00:00:00 WST 2010 
Thu Apr 01 00:00:00 WST 2010 

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

Другой вариант - дублировать код печати до while (yuck) или использовать do...while (также yuck).

+1

Я бы с этим +1 за то, что получил как начальную, так и конечную даты, включая – MadProgrammer

+0

@George .. очень приятно .. – SWEE

+0

Борьба с Java-календарями одна моих специальностей. – George

1

Вы можете просто выводить его непосредственно перед началом цикла:

System.out.println(gcal.getTime()); 
while (gcal.getTime().before(end)) { 
    gcal.add(Calendar.MONTH, 1); 
    Date d = gcal.getTime(); 
    System.out.println(d); 
} 
+0

Слушайте, мне нужно распечатать в этом цикле. – SWEE

1

затем просто сделать это:

Date lNow = gcal.getTime(); 
System.out.println(lNow); 

while (gcal.getTime().before(end)) { 
     gcal.add(Calendar.MONTH, 1); 
     Date d = gcal.getTime(); 
     System.out.println(d); 
} 
3

Вы можете использовать do-while цикл, но вам нужно будет изменить дату end в зависимости от того, хотите ли вы включить ее или нет.

В приведенном ниже примере включает в себя все месяцы между 01st или 04th включительно ...

try { 
    Calendar gcal = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM"); 
    Date start = sdf.parse("2010.01"); 
    Date end = sdf.parse("2010.05"); 
    gcal.setTime(start); 
    do { 
     Date d = gcal.getTime(); 
     System.out.println(d); 
     gcal.add(Calendar.MONTH, 1); 
    } while (gcal.getTime().before(end)); 
} catch (ParseException exp) { 
    exp.printStackTrace(); 
} 

Пример вывода ...

Fri Jan 01 00:00:00 EST 2010 
Mon Feb 01 00:00:00 EST 2010 
Mon Mar 01 00:00:00 EST 2010 
Thu Apr 01 00:00:00 EST 2010 

Равным образом, вы могли бы просто использовать текущий код и изменить startDate - месяцем ранее ...

Date start = sdf.parse("2009.12"); 
//... 

Обновлено

Другой подход, основанный на предыдущих идей ...

Просто переместите start дату назад в месяц до начала цикла ...

Calendar gcal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM"); 
Date start = sdf.parse("2010.01"); 
Date end = sdf.parse("2010.04"); 
gcal.setTime(start); 
// Move the month back by one before we start... 
gcal.add(Calendar.MONTH, -1); 
while (gcal.getTime().before(end)) { 
    gcal.add(Calendar.MONTH, 1); 
    Date d = gcal.getTime(); 
    System.out.println(d); 
} 

Это достаточно простой и позволяет вам предоставлять переменные даты, не заботясь о том, чтобы помнить, что вам нужно начинать месяцем ранее.

+0

есть ли способ установить месяц назад .. – SWEE

+0

Почему бы не переместить gcal.add (Calendar.MONTH, 1); до конца тела? Проще нет? – Thihara

+0

Я имею в виду, не переходя к циклу do while. – Thihara

1

Поскольку Java 8, вы можете использовать новый java.time API:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu.MM"); 
YearMonth date = YearMonth.parse("2010.01", formatter); 
YearMonth end = YearMonth.parse("2010.05", formatter); 
while (!date.isAfter(end)) { 
    System.out.println(date.format(formatter)); 
    date = date.plusMonths(1); 
} 
+0

+1 для 'java.time' ... или по крайней мере Joda-Time ... – George

Смежные вопросы