Java根据指定的年份,每行指定的月份数,打印该年日历
时间: 2024-10-29 17:12:30 浏览: 14
在Java中,你可以使用`java.time`包下的`YearMonth`类和`CalendarPrinter`类来自动生成年历。以下是一个简单的示例,展示如何根据指定的年份和每行显示的月份数打印日历:
```java
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class CalendarGenerator {
private static final int MONTHS_PER_ROW = 3; // 每行显示的月份数
public static void main(String[] args) {
int targetYear = 2023; // 指定的年份
for (YearMonth yearMonth : generateYearsMonths(targetYear)) {
System.out.printf("%s\n", yearMonth);
printMonth(yearMonth, MONTHS_PER_ROW);
}
}
private static List<YearMonth> generateYearsMonths(int year) {
List<YearMonth> yearsMonths = new ArrayList<>();
for (int month = 1; month <= 12; month++) {
yearsMonths.add(YearMonth.of(year, month));
}
return yearsMonths;
}
private static void printMonth(YearMonth yearMonth, int monthsPerRow) {
Calendar calendar = getCalendarInstance(yearMonth);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < monthsPerRow; i++) {
int weekStartDay = calendar.get(Calendar.DAY_OF_WEEK); // 获取第一周的第一天
for (int j = 0; j < 6; j++, calendar.add(Calendar.DAY_OF_MONTH, 1)) { // 显示一周的日历
if ((i * 6 + j) % monthsPerRow == 0) { // 如果到新的一行
sb.append('\n');
}
sb.append(calendar.format("yyyy-MM-dd")); // 格式化日期
}
}
System.out.println(sb.toString());
}
private static Calendar getCalendarInstance(YearMonth yearMonth) {
return yearMonth.atStartOfMonth().atStartOfDay().toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate().atStartOfDay(ZoneId.systemDefault())
.toZonedDateTime().toInstant().toCalendar(ZoneId.systemDefault());
}
}
```
这个程序首先生成指定年份的所有月,然后按行打印每个月份的日历。`printMonth`函数会处理每个月的日历,并将其格式化为"yyyy-MM-dd"。
阅读全文