巧用Java中Calendar工具类

Java的JDK中提供了一系列好用的util工具类。Calendar就是java.util中用于处理日期的工具类。且该工具类易学易用实用。

工具类Calendar是抽象类。

PS:为什么把Calendar定义成抽象类呢?很简单,仔细想想就会知道:全世界有很多种计量日期的方式,所以要把Calendar定义成一个抽象类,日本有日历计量方式;而中国就有阳历阴历之说。

抽象类是不能New的,所以,通常我们会通过Calendar的子类来操作日期。我们通过 Calendar .getInstance()方法,能够拿到具体的日历子类实现。Calendar.getInstance()的源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static Calendar getInstance()
   {
       Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
       cal.sharedZone = true;
       return cal;
   }
private static Calendar createCalendar(TimeZone zone,
                                          Locale aLocale)
   {
       Calendar cal = null;
       String caltype = aLocale.getUnicodeLocaleType("ca");
       if (caltype == null) {
           // Calendar type is not specified.
           // If the specified locale is a Thai locale,
           // returns a BuddhistCalendar instance.
           if ("th".equals(aLocale.getLanguage())
                   && ("TH".equals(aLocale.getCountry()))) {
               cal = new BuddhistCalendar(zone, aLocale);
           } else {
               cal = new GregorianCalendar(zone, aLocale);
           }
       } else if (caltype.equals("japanese")) {
           cal = new JapaneseImperialCalendar(zone, aLocale);
       } else if (caltype.equals("buddhist")) {
           cal = new BuddhistCalendar(zone, aLocale);
       } else {
           // Unsupported calendar type.
           // Use Gregorian calendar as a fallback.
           cal = new GregorianCalendar(zone, aLocale);
       }
       return cal;
   }

 

那么Calendar.getInstance()这个方法都做了哪些事情呢?虽然方法被命名为getInstance(),但是它并不能说明Calendar是一个单例的。通过上面源代码我们就能略知一二。该方法,主要就是通过你所在的时区、日历格式,以及当前时间,确定这一时刻的Calendar对象。

PS:为什么Calendar不使用单例实现呢?很简单,仔细想一想,单例返回的永远都是一个对象,即对象的引用是相同的。故C1和C2两个日历对象,你改变了C1,那么C2自动改变显然不是你想要的。

Calendar工具类的使用很简单,但是JDK文档里面说的太过于繁琐了。所以我根据网上的一些资料,整理了一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
public static void main(String[] args) {
    // Calendar的子类
    // GregorianCalendar
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());
    // 设置日期为2011-07-24 09:59:50
    calendar.set(2011, 06, 24, 9, 59, 50);
    // 12小时制
    int temp12Hour = Calendar.HOUR;
    // 24小时制
    int temp24Hour = calendar.HOUR_OF_DAY;
    // 显示年份
    int yearIndex = Calendar.YEAR;
    int year = calendar.get(yearIndex);
    System.out.println("yearIndex=" + yearIndex);
    System.out.println("year=" + year);
    // 显示月份 (从0开始, 实际显示要加一)
    int monthIndex = Calendar.MONTH;
    int month = calendar.get(monthIndex) + 1;
    System.out.println("monthIndex=" + monthIndex);
    System.out.println("month=" + month);
    // 今年的第几天
    int dayOfYearIndex = Calendar.DAY_OF_YEAR;
    int dayOfYear = calendar.get(dayOfYearIndex);
    System.out.println("dayOfYearIndex=" + dayOfYearIndex);
    System.out.println("dayOfYear=" + dayOfYear);
    // 本月的第N天
    int dayOfMonthIndex = Calendar.DAY_OF_MONTH;
    int dayOfMonth = calendar.get(dayOfMonthIndex);
    System.out.println("dayOfMonthIndex=" + dayOfMonthIndex);
    System.out.println("dayOfMonth=" + dayOfMonth);
    // 本周第N天,从周日开始
    int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
    if (dayOfWeek == 0) {
        dayOfWeek = 7;
    }
    System.out.println("dayOfWeek=" + dayOfWeek);
    // 三小时以后
    int hourOfDayIndex = Calendar.HOUR_OF_DAY;
    calendar.add(hourOfDayIndex, 3);
    int afterThreeHour = calendar.get(hourOfDayIndex);
    System.out.println("afterThreeHour=" + afterThreeHour);
    // 当前分钟数
    int minuteIndex = Calendar.MINUTE;
    int minute = calendar.get(minuteIndex);
    System.out.println("minuteIndex=" + minuteIndex);
    System.out.println("minute=" + minute);
    // 15分钟以后
    calendar.add(minuteIndex, 15);
    minute = calendar.get(minuteIndex);
    System.out.println("minute+15=" + minute);
    // 30分钟以前
    calendar.add(minuteIndex, -30);
    minute = calendar.get(minuteIndex);
    System.out.println("minute-30=" + minute);
    // 格式化显示
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS");
    String time = sdf.format(calendar.getTime());
    System.out.println(time);
    // 重置Calendar显示当前时间
    calendar.setTime(new Date());
    time = sdf.format(calendar.getTime());
    System.out.println(time);
    // 创建一个Calendar 用于比较时间
    Calendar calendarNew = Calendar.getInstance();
    // 设定为5小时以前,后者大,显示-1
    calendarNew.add(Calendar.HOUR, -5);
    System.out.println("时间比较:" + calendarNew.compareTo(calendar));
    // 设定7小时以后,前者大 ,显示1
    calendarNew.add(Calendar.HOUR, +7);
    System.out.println("时间比较:" + calendarNew.compareTo(calendar));
    // 退回2小时,时间相同,显示0
    calendarNew.add(Calendar.HOUR, -2);
    System.out.println("时间比较:" + calendarNew.compareTo(calendar));
    // 创建两个日历对象
    Calendar cal = Calendar.getInstance();
    Calendar future = Calendar.getInstance();
    // 打印当前日期
    System.out.println("Current date: " + cal.getTime());
    // 改变年份
    future.set(Calendar.YEAR, 2066);
    System.out.println("Year is " + future.get(Calendar.YEAR));
    // 检查日期是否在当前日期之后
    if (future.after(cal)) {
        System.out.println("Date " + future.getTime() + " is after current date.");
    }
}

日期操作,是Java编程中很重要的一部分,同时,它的简单易用更加让你青睐它。使用Calendar基本上能够帮助我们顺利完成百分之九十九点九九的工作。Calendar,你会了吗?

 

转载自:http://www.tuicool.com/articles/qeyAba

posted @   流星<。)#)))≦  阅读(940)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示