利用 GregorianCalendar 制作当前月的月历

【0】README

0.1)本文文字总结于 core java volume 1 , 源代码均为原创;
0.2)本文旨在熟悉 GregorianCalendar 日历类,每一天就是一个GregorianCalendar 日历类,一天有很多的日历属性,觉得用它打印一个月份的日历出来很好玩的样子;

【1】直接对源代码的关键步骤进行分析:

  • step1) 首先构造一个日历对象,并用当前的日期和时间进行初始化(这里还设置了日历类的时区和方言):
gc = new GregorianCalendar(TimeZone.getTimeZone("Asia/Chongqing"),Locale.SIMPLIFIED_CHINESE);
  • step2) 调用get方法获得当前的日月
today = gc.get(Calendar.DAY_OF_MONTH);
month = gc.get(Calendar.MONTH); //当前月份
  • step3) 将 gc 设置为当前月的第一天,得到这个月的第一天是星期几以及一周的第一天:
gc.set(Calendar.DAY_OF_MONTH, 1); //设置 gc 为当前月的第一天
weekday = gc.get(Calendar.DAY_OF_WEEK);//这个月的第一天是星期几
firstDayOfWeek = gc.getFirstDayOfWeek(); // 一周的第一天,美国是周日,中国是周一
  • 如果第一天是星期日,变量firstDayOfWeek就是Calendar.SUNDAY , 如果是星期一,就设置为Calendar.MONDAY, 以此类推;(在美国,每个星期的第一天是星期日, 而欧洲是星期一)
  • Hint)如果想看到不同地区程序的输出, 应该在main 方法的第一行中添加如下代码(如ITALY):
Locale.setDefault(Locale.ITALY);
  • step4)获得星期名数组+打印星期
weekdayNames = new DateFormatSymbols().getShortWeekdays();//星期名数组
for(String str : weekdayNames) //打印星期名称数组
    out.printf("%6s", str);
out.printf("\n");
  • step5)打印前面的缩进空格(空格数==这个月第一天的星期数减去该地区星期的起始计数(美国是星期日,中国是星期一))
 for (int i = 0; i < weekday - firstDayOfWeek; i++)
    out.printf("%5s", " "); //打印前面的缩进空格
  • step6)正式开始打印日历(只需要注意,当循环到的日历天 属于 该地区星期的起始计数时(美国是星期日,中国是星期一),要换行打印,以及如果日历循环到今天,则多打印一个*号以示区别)
for (int i = 1; i <= 100; i++)
{
    gc.set(Calendar.DAY_OF_MONTH, i);
    if(gc.get(Calendar.MONTH) != month)
        break;
    if(gc.get(Calendar.DAY_OF_WEEK) == firstDayOfWeek)
        out.printf("\n");
    out.printf("%5d", i);
    if(i == today)
        out.printf("*");
}

【2】源代码

2.1)download source code: https://github.com/pacosonTang/core-java-volume/blob/master/chapter4/Chapter4Test.java 中的 main1 方法;
2.2)source code at a glance:

public static void main1(String[] args)
    {
        GregorianCalendar gc;
        int today;
        int month;
        int weekday;
        int firstDayOfWeek;
        String[] weekdayNames;      

        Locale.setDefault(Locale.CHINESE);// 设置方言为 简体中文;
        gc = new GregorianCalendar(TimeZone.getTimeZone("Asia/Chongqing"),Locale.SIMPLIFIED_CHINESE);
        // 上行设置日历的时区和方言
        today = gc.get(Calendar.DAY_OF_MONTH);
        gc.set(Calendar.DAY_OF_MONTH, 1); //设置 gc 为当前月的第一天
        weekday = gc.get(Calendar.DAY_OF_WEEK);//这个月的第一天是星期几
        firstDayOfWeek = gc.getFirstDayOfWeek(); // 一周的第一天,美国是周日,中国是周一
        month = gc.get(Calendar.MONTH); //当前月份
        weekdayNames = new DateFormatSymbols().getShortWeekdays();//星期名数组

        //System.out.println(today + " " + month + " " + weekday + " " + firstDayOfWeek);
        for(String str : weekdayNames) //打印星期名称数组
            out.printf("%6s", str);
        out.printf("\n");

        for (int i = 0; i < weekday - firstDayOfWeek; i++)
            out.printf("%5s", " "); //打印前面的缩进空格

        for (int i = 1; i <= 100; i++)
        {
            gc.set(Calendar.DAY_OF_MONTH, i);
            if(gc.get(Calendar.MONTH) != month)
                break;
            if(gc.get(Calendar.DAY_OF_WEEK) == firstDayOfWeek)
                out.printf("\n");
            out.printf("%5d", i);
            if(i == today)
                out.printf("*");
        }
    }

【3】打印结果(我是10月31号修改的源代码)

利用 GregorianCalendar 制作当前月的月历_第1张图片

你可能感兴趣的:(java,日历)