您的位置:首页 > 其它

Calendar 的学习与运用

2015-02-04 08:37 155 查看

Java对时间的处理最经常用到的就是Java.util下的Calendar类,由于经常用到,现对这个类常用的加以总结,方便大家和自己以后使用:

Calendar
类是一个抽象类,它为特定瞬间与一组诸如
YEAR
MONTH
DAY_OF_MONTH
HOUR


日历字段
之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为
protected

与其他语言环境敏感类一样,
Calendar
提供了一个类方法
getInstance
,以获得此类型的一个通用的对象。
Calendar
getInstance
方法返回一个
Calendar
对象,其日历字段已由当前日期和时间初始化:

Calendar rightNow = Calendar.getInstance();

以下是我练习用到的方法和事项,其中有一些需要注意的“坑”,希望大家遇到时可以避免这些错误:

package com.sr.test;

import java.util.Calendar;

import java.util.Date;

public class CalendarTest {

static Calendar calendar;

public static void main(String[] args) {

/* calendar = Calendar.getInstance();

//当前时刻

System.out.println(calendar.getTime() + "___当前时刻");

//昨日当前时刻

System.out.println(getNowOfLastDay() + "___昨日当前时刻");

//一个月之前当前时刻

System.out.println(getNowOfLastMonth() + "___上个月当前时刻");

//一年之前当前时刻

System.out.println(getNowOfLastYear() + "___上年当前时刻");*/



addMoreTest();

}

public static Calendar resumeCalendar() {

calendar = Calendar.getInstance();

return calendar;

}

//昨日当前时刻

public static Date getNowOfLastDay() {

resumeCalendar();

calendar.add(Calendar.DATE, -1);

Date lastDay = calendar.getTime();

return lastDay;

}

//上个月当前时刻

public static Date getNowOfLastMonth() {

resumeCalendar();

calendar.add(Calendar.MONTH, -1);

Date lastMonth = calendar.getTime();

return lastMonth;

}

//上年当前时刻

public static Date getNowOfLastYear() {

resumeCalendar();

calendar.add(Calendar.YEAR, -1);

Date lastYear = calendar.getTime();

return lastYear;

}

public static void elseTest() {

//在 Calendar 的方法中,get() 和 add() 会让 Calendar 立刻刷新。

//另外我们要注意的一点是,Calendar 为了性能原因对 set() 方法采取延缓计算的方法。

//Set() 的这个特性会给我们的开发带来一些意想不到的结果。我们后面会看到这个问题。

//在 JavaDoc 中有下面的例子来说明这个问题:

Calendar cal1 = Calendar.getInstance();

cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31

cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1

//System.out.println(cal1.getTime()); //(此处做个输出就会转到2000-10-1 没有的话就会是2000-9-31)

cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30

System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录



}

public static void addMoreTest() {

Calendar cal1 = Calendar.getInstance();

cal1.set(2000, 1, 32, 0, 0, 0);

System.out.println(cal1.getTime());

cal1.setLenient(false);

cal1.set(2000, 1, 32, 0, 0, 0);

System.out.println(cal1.getTime());



/* Tue Feb 01 00:00:00 PST 2000

Exception in thread "main" java.lang.IllegalArgumentException

at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:1368)

at java.util.Calendar.updateTime(Calendar.java:1508)

at java.util.Calendar.getTimeInMillis(Calendar.java:890)

at java.util.Calendar.getTime(Calendar.java:871)

at WhatIsCalendar.main(WhatIsCalendar.java:12)

当我们设置该 Calendar 为 Lenient false 时,它会依据特定的月份检查出错误的赋值*/



}

public static void addAndRoll(){

// Roll() 的规则只有一条:

//当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。如:





//add() 的功能非常强大,add 可以对 Calendar 的字段进行计算。

//如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。

Calendar cal1 = Calendar.getInstance();

cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日

cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 周二

cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日

cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 周日

//WEEK_OF_MONTH 比 MONTH 字段小,所以 roll 不能修正 MONTH 字段。

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: