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