Java基础(二)巧用Java中Calendar工具类

本文详细解读Java的Calendar类,包括其抽象性质、如何获取具体实例及使用方法,并通过示例代码展示了如何操作日期和时间,强调了Calendar类在日期操作中的重要性和实用性。

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


工具类Calendar是抽象类。


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


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

 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文档里面说的太过于繁琐了。所以我根据网上的一些资料,整理了一下:

package com.lzq.calendar;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/** @author     : lzq
 * @Date       : 2015年7月30日 下午1:49:05
 * @Comments   : Calendar工具类 
 * @Version    : 1.0.0
 */
public class CalendarTest {
	
	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,你会了吗?


参考:

1、http://blog.youkuaiyun.com/joyous/article/details/9630893

2、http://swiftlet.net/archives/1284

3、http://www.yiibai.com/java/util/enumset_complementof.html

4、JDK文档




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值