Calendar和GregorianCalendar日历类
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
注意月份的表示,一月是0,二月是1,以此类推,12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类Calendar使用常量来表示月份:JANUARY, FEBRUARY,等等。
// 时间为2018-11-08零点 Calendar calendar = new GregorianCalendar(2018, 10, 8, 0, 0, 0);
/**
* 打印当前月份日历
*/
public class CalendarTest {
public static void main(String[] args) {
// 设置日历的显示的地区(根据自己的需要写)
Locale.setDefault(Locale.ENGLISH);
// GregorianCalendar是Calendar的子类
GregorianCalendar gc = new GregorianCalendar();
int today = gc.get(Calendar.DAY_OF_MONTH);
int month = gc.get(Calendar.MONTH);
// 设置月份的起始日期为1
gc.set(Calendar.DAY_OF_MONTH, 1);
// 获取一周中的第几天
int weekday = gc.get(Calendar.DAY_OF_WEEK);
// 获取一周中的第一天
int firstDayOfWeek = gc.getFirstDayOfWeek();
// 计算月份第一行的缩进数
int indent = 0;// 缩进数
while (weekday != firstDayOfWeek) {
indent++;
gc.add(Calendar.DAY_OF_MONTH, -1);// 日期减1
weekday = gc.get(Calendar.DAY_OF_WEEK);
}
// 打印星期名
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
do {
System.out.printf("%4s", weekdayNames[weekday]);
gc.add(Calendar.DAY_OF_MONTH, 1);
weekday = gc.get(Calendar.DAY_OF_WEEK);
} while (weekday != firstDayOfWeek);
System.out.println();
// 打印日历第一行的缩进空格
for (int i = 0; i <= indent; i++) {
System.out.print(" ");// 两个空格
}
// 设置月份的起始日期为1
gc.set(Calendar.DAY_OF_MONTH, 1);
// 打印日期
do {
// 打印天数
int day = gc.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day);
// 用“*”标记今天
if (day == today) {
System.out.print("*");
} else {
System.out.print(" ");
}
gc.add(Calendar.DAY_OF_MONTH, 1);// 天数加1
weekday = gc.get(Calendar.DAY_OF_WEEK);
// 打印一周后换行
if (weekday == firstDayOfWeek) {
System.out.println();
}
} while (gc.get(Calendar.MONTH) == month);// 到下个月结束
}
}