Java日历跳过第一个月

时间:2015-06-26 13:57:26

标签: java calendar

我目前正在尝试制作一个Java程序,只打印出一年中每一天的日期。除了一月之外,它在一年中的每个月都能完美运行。任何人都可以建议我可能做错了什么?请在下面找到代码。

String date;

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MONTH, 0);
    cal.set(Calendar.DAY_OF_MONTH, 0);
        int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        int maxMon = cal.getActualMaximum(Calendar.MONTH);
        SimpleDateFormat df = new SimpleDateFormat("dd_MM_yy");
        for (int j = 0; j < maxMon; j++){
            for (int i = 0; i < maxDay; i++) {
                    cal.set(Calendar.DAY_OF_MONTH , i);
                    date = df.format(cal.getTime());
                    System.out.println(date);
            }
        } 

3 个答案:

答案 0 :(得分:2)

首先,你需要在月份循环中获得int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

接下来,请注意MONTHDAY_OF_MONTH有不同的基础: MONTH从0开始,因此maxMon将为11. DAY_OF_MONTH从1开始,因此maxDay将在28-31范围内。

因此,如果您相应更改循环(从j = 0i = 1开始并使用j <= maxMoni <= maxDay),您的结果应该没问题。

答案 1 :(得分:2)

日历的索引是......特别的。

DAY_OF_MONTH从1开始,MONTH从零开始。 getActualMaximum返回实际的最大值,也需要包含在循环中。除此之外,您在迭代它时没有更改日历实例上的月份字段。

我冒昧地让你的循环代码更容易理解。

String date;

Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 0);

SimpleDateFormat df = new SimpleDateFormat("dd_MM_yy");
for (int i = 0; i <= cal.getActualMaximum(Calendar.MONTH); i++) {
    cal.set(Calendar.MONTH, i);
    for (int j = 1; j <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); j++) {
        cal.set(Calendar.DAY_OF_MONTH , j);
        date = df.format(cal.getTime());
        System.out.println(date);
    }
}

答案 2 :(得分:0)

java.time

现代方法是使用java.time类。旧的日期时间类是一团糟,设计糟糕,令人困惑,麻烦。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

TemporalAdjuster

TemporalAdjuster接口提供了操作日期时间值的类。 TemporalAdjusters类(注意复数s)提供了一些方便的实现。

LocalDate firstOfMonth = today.with( TemporalAdjusters.firstDayOfMonth() );

现在循环整个月。获取下个月的第一个作为循环的限制。生成缩写格式的字符串,自动本地化为魁北克。

LocalDate firstOfNextMonth = today.with( TemporalAdjusters.firstDayOfNextMonth() );
LocalDate ld = firstOfMonth;
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale );
System.out.println( ld.getMonth().getDisplayName( TextStyle.FULL , locale ) );  // Print localized name of the month being reported.
do {
    System.out.println( ld.format( f ) );  // Create String representing this date.
} while ( ld.isBefore( firstOfNextMonth ) );
  

OCTOBRE

     

16-10-01

     

16-10-02

     

...

请参阅code in action