在java中查找两个给定日期之间的所有月份名称

时间:2012-08-22 08:43:17

标签: 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

有人能帮助我吗?在此先感谢。

7 个答案:

答案 0 :(得分:10)

您可以简单地使用the Calendar class并通过在每次迭代using myCalendar.add(Calendar.MONTH, 1);添加一个月来从一个日期迭代到另一个日期。

Calendar类负责避免溢出并为您更新其他字段(此处为年份)。

答案 1 :(得分:10)

使用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 :(得分: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;
}

答案 3 :(得分:4)

虽然其他答案在撰写时都是很好的答案,但它们现在已经过时了。自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 :(得分:1)

这样做

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

答案 5 :(得分:0)

假设你有这两个约会。你可以通过迭代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);
}

您可以在列表中添加日期或做任何想要做的事情!!!

答案 6 :(得分:0)

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 ) ;

循环。

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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore