我目前正在尝试制作一个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);
}
}
答案 0 :(得分:2)
首先,你需要在月份循环中获得int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
。
接下来,请注意MONTH
和DAY_OF_MONTH
有不同的基础:
MONTH
从0开始,因此maxMon
将为11. DAY_OF_MONTH
从1开始,因此maxDay
将在28-31范围内。
因此,如果您相应更改循环(从j = 0
和i = 1
开始并使用j <= maxMon
和i <= 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类。旧的日期时间类是一团糟,设计糟糕,令人困惑,麻烦。
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。