Найти все месячные имена между двумя датами в java

Мне нужны все имена месяца/года между двумя заданными датами. Мне нужно, чтобы это выкладывалось только на java.

Пример:

Input Date:

    date 1- 20/12/2011 
    date 2- 22/08/2012

Now ,my expected result should be :- 

        Dec/2011
        Jan/2012
        Feb/2012
        Mar/2012
        Apr/2012
        May/2012
        Jun/2012
        Jul/2012
        Aug/2012

Может кто-нибудь мне помочь. Спасибо в Advance.

Ответ 1

Используя Joda-Time (поскольку не указано, я предполагаю, что вы могли бы хотя бы взглянуть на то, что время Joda):

 LocalDate date1 = new LocalDate("2011-12-12");
 LocalDate date2 = new LocalDate("2012-11-11"); 
 while(date1.isBefore(date2)){
     System.out.println(date1.toString("MMM/yyyy"));
     date1 = date1.plus(Period.months(1));
 }

Ответ 2

Вы можете просто использовать класс Calendar и перебирать с одной даты на другую, добавив месяц на каждую итерацию using myCalendar.add(Calendar.MONTH, 1);.

Класс Calendar заботится о том, чтобы избежать переполнения и обновлять другие поля (здесь год) для вас.

Ответ 3

java.time.YearMonth

В то время как другие ответы были хорошими при написании, они теперь устарели. С тех пор как в Java 8 появился класс YearMonth, эта задача значительно упростилась:

    String date1 = "20/12/2011";
    String date2 = "22/08/2012";

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.ROOT);
    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMM/uuuu", Locale.ROOT);
    YearMonth endMonth = YearMonth.parse(date2, dateFormatter);
    for (YearMonth month = YearMonth.parse(date1, dateFormatter);
            ! month.isAfter(endMonth);
            month = month.plusMonths(1)) {
        System.out.println(month.format(monthFormatter));
    }

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

Dec/2011
Jan/2012
Feb/2012
Mar/2012
Apr/2012
May/2012
Jun/2012
Jul/2012
Aug/2012

Пожалуйста, предоставьте соответствующую локализацию для второго звонка DateTimeFormatter.ofPattern(), чтобы получить названия месяцев на вашем языке. И первый звонок тоже на всякий случай.

Ответ 4

За разговор выше. Используйте Календарь и метод добавления.

Я не тестировал это, но он там:

public static List<Date> datesBetween(Date d1, Date d2) {
    List<Date> ret = new ArrayList<Date>();
    Calendar c = Calendar.getInstance();
    c.setTime(d1);
    while (c.getTimeInMillis()<d2.getTime()) {
        c.add(Calendar.MONTH, 1);
        ret.add(c.getTime());
    }
    return ret;
}

Ответ 5

Сделайте это

 Calendar cal = Calendar.getInstance();
 cal.setTime(your_date_object);
 cal.add(Calendar.MONTH, 1);

Ответ 6

Итак, предположим, что у вас эти две даты. И вы можете легко сравнить его, итерации цикла while до fromDate перед toDate.

Date fromDate= new Date("1/4/2016");
Date toDate = new Date("31/12/2016");

int i=0;
while(fromDate.before(toDate)){
    i=i+1;
    fromDate.setMonth(i);
    System.out.println(fromDate);
}

Вы можете добавить дату в список или сделать то, что хотите сделать.

Ответ 7

java.time

Современный подход использует классы java.time. Никогда не используйте Date/Calendar/SimpleDateFormat и тому подобное.

LocalDate

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

LocalDate startLocalDate = LocalDate.of( 2011 , Month.DECEMBER , 20 ) ;  
LocalDate stopLocalDate = LocalDate.of( 2012 , Month.AUGUST , 2 ) ;

YearMonth

Если вас интересуют только год и месяц, используйте класс YearMonth.

YearMonth start = YearMonth.from( startLocalDate) ;
YearMonth stop = YearMonth.from( stopLocalDate ) ;

Loop.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM/uuuu" , Locale.US ) ;
int initialCapacity = start.until( stop , ChronoUnit.MONTHS ) ;
List< YearMonth > yearMonths = new ArrayList<>( initialCapacity ) ;
YearMonth ym = start ;
while ( ym.isBefore( stop ) ) {
    System.out.println( ym.format( f ) ) ;  // Output your desired text.
    yearMonths.add( ym ) ;
    ym = ym.plusMonths( 1 ) ;  // Increment to set up next loop.
}

О java.time

Среда java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на классы java.time.

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в классах java.sql.*.

Где взять классы java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с встроенной реализацией ,
    • Java 9 добавляет некоторые мелкие функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и еще more.