java核心技术学习笔记(三)—GregorianCalendar

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011172283/article/details/50704661

我们平时常用的java时间工具类应该有Date和GregorianCalendar,其中Date类的实例状态表示的是一个时间点,而GregorianCalendar则是以日历的方式管理时间,非常方便的就可以实现时间的定位和时间的偏移(从现在这一刻往前或后延时几天,几小时等),相对于Date类,GregorianCalendar则灵活了很多。

使用GregorianCalendar需要注意的是月份从0开始计数,因此11表示十二月。为了清晰起见,也可以使用常量。如Calendar.DECEMBER。今天以例子+注释的方式记录GregorianCalendar的常见用法。

这个实例是按常见的日历格式,打印了本月的日历,运行结果如下:
这里写图片描述

import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

public class CalendarTest {
    public static void main(String[] args) {
        Calendar.DECEMBER
        // 设置默认位置
        Locale.setDefault(Locale.CHINESE);
        // 获取当前日期
        GregorianCalendar calendar = new GregorianCalendar();
        // 获取今天是当前月的第几天
        int today = calendar.get(Calendar.DAY_OF_MONTH);
        // 获取当前是今年第几个月;一月是0
        int month = calendar.get(Calendar.MONTH);
        // 将时间设为当前月第一天
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        // 获取本月第一天是一周的第几天
        int weekday = calendar.get(Calendar.DAY_OF_WEEK);
        // 获取星期是从那天开始,美国周日是星期的第一天
        int firstDayOfWeek = calendar.getFirstDayOfWeek();
        // 确定本月第一天是星期几,前面应该输出多少空位
        int indent = 0;
        // 循环计算本月的第一天是一个星期的第几天,以确定第一行输出多少空格
        while (weekday != firstDayOfWeek) {  
            indent++; // 输出空格计数+1
            // 把日期往前减一天,非常方便的调整时间,
            // add负数,时间往前推,反之后推
            calendar.add(Calendar.DAY_OF_MONTH, -1);
            // 前一天是一星期的第几天
            weekday = calendar.get(Calendar.DAY_OF_WEEK);
        }
        // 获取星期简写(Sun Mon Tue...)
        String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
        do {
            // 经过上面的循环,这里weekday已经是一个星期的第一天了
            // 这里输出星期标题
            System.out.printf("%8s",weekdayNames[weekday]);
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            weekday = calendar.get(Calendar.DAY_OF_WEEK);
        } while (weekday != firstDayOfWeek); 
        System.out.println();
        // 打印本月第一天距星期第一天之间的空格
        for (int i = 0; i < indent; i++) {
            System.out.print("       ");
        }
        // 重置日期为本月第一天
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        // 打印日期
        do {
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            System.out.printf("%6d",day);
            // 用*标记当前天
            if (day == today) {
                System.out.print("*");
            }else {
                System.out.print(" ");
            }
            // 打印完后,日期后推一天
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            weekday = calendar.get(Calendar.DAY_OF_WEEK);
            // 打印到下一周换行
            if (weekday == firstDayOfWeek) {
                System.out.println();
            }
        } 
        // 如果还在本月,就一直打印直到下个月
        while (calendar.get(Calendar.MONTH) == month);
    }
}

GregorianCalendar相对于Date类还是有不少优越性的,如果只是获取一下当前时间点,当然一个Date类就够了,但是如果需要管理时间,计算时间段,时间往前或者往后延伸,那么GregorianCalendar的优越性还是很明显的

猜你喜欢

转载自blog.csdn.net/u011172283/article/details/50704661