Calendar的中文翻译是日历,实际上,在历史上有着许多种计时的方法。所以为了计时的统一,必需指定一个日历的选择。那现在最为普及和通用的日历就是"Gregorian Calendar"。也就是我们在讲述年份时常用"公元**年"。Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。Calendar.getInstance()中所获得的实例就是一个"GreogrianCalendar"对象。
Calendar获取时间的常见方法
importjava.util.Calendar;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Calendarcal=Calendar.getInstance();
intyear=cal.get(Calendar.YEAR);
//比当前月份少1
intmonth=cal.get(Calendar.MONTH);
//date表示日期,day表示天数,所以date与day_of_month相同
intdate=cal.get(Calendar.DATE);
intdayOfMonth=cal.get(Calendar.DAY_OF_MONTH);
//表示本周的第几天,从周日开始计算
intdayOfWeek=cal.get(Calendar.DAY_OF_WEEK);
intdayOfYear=cal.get(Calendar.DAY_OF_YEAR);
//12小时制
inthour=cal.get(Calendar.HOUR);
//24小时制
inthourOfDay=cal.get(Calendar.HOUR_OF_DAY);
intminute=cal.get(Calendar.MINUTE);
intsecond=cal.get(Calendar.SECOND);
intmillisecond=cal.get(Calendar.MILLISECOND);
intmaxDate=cal.getActualMaximum(Calendar.DATE);
System.out.println("现在的年份为:"+year);
System.out.println("现在的月份为:"+month);
System.out.println("现在的号为:"+date);
System.out.println("现在的号为:"+dayOfMonth);
System.out.println("现在是星期:"+dayOfWeek);
System.out.println("现在过了的天数为:"+dayOfYear);
System.out.println("现在几点:"+hour);
System.out.println("现在几点:"+hourOfDay);
System.out.println("现在几分:"+minute);
System.out.println("现在几秒:"+second);
System.out.println("现在几毫秒:"+millisecond);
System.out.println("本月最后一天是:"+maxDate);
}
}
补充说明:
(1)注意getActualMaximum()和getMaximum()的区别。getMaximum()获取的“字段最大值”,是指在综合所有的日期,在所有这些日期中得出的“字段最大值”。例如getMaximum(Calendar.DATE)的目的是“获取日的最大值”。综合所有的日期,得出一个月最多有31天。因此,getMaximum(Calendar.DATE)的返回值是31。getActualMaximum() 获取的“当前日期时该字段的最大值”。例如,当日期为2013-09-01时,getActualMaximum(Calendar.DATE)是获取“日的最大值”是30。当前日期是9月份,而9月只有30天。因此,getActualMaximum(Calendar.DATE)的返回值是30。
(2)Calendar.HOUR_OF_DAY使用24进制。Calendar.HOUR使用12进制。
Calendar设置时间的常见方法
Calendar的set()方法
set(int field, int value)是用来设置"年/月/日/小时/分钟/秒/微秒"等值
set(int year, int month, int day, int hour, int minute, int second) 但没有
set(int year, int month, int day, int hour, int minute, int second, int millisecond)
前面set(int,int,int,int,int,int)方法不会自动将MilliSecond清为0。
另外,月份的起始值为0而不是1,所以要设置八月时,我们用7而不是8。
calendar.set(Calendar.MONTH, 7);
Calendar对象的容错性(Lenient设置)
我们知道特定的月份有不同的日期,当一个用户给出错误的日期时,Calendar 如何处理的呢?
publicclassTest
{
publicstaticvoidmain(String[]args)throwsException
{
Calendarcal=Calendar.getInstance();
cal.set(2000,1,32,0,0,0);
System.out.println(cal.getTime());
cal.setLenient(false);
cal.set(2000,1,32,0,0,0);
System.out.println(cal.getTime());
}
}
执行结果为:
Fri Mar 03 00:00:00 CST 2000
Exception in thread "main" java.lang.IllegalArgumentException: DAY_OF_MONTH
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2316)
at java.util.Calendar.updateTime(Calendar.java:2260)
at java.util.Calendar.getTimeInMillis(Calendar.java:1044)
at java.util.Calendar.getTime(Calendar.java:1017)
at Test.main(Test.java:27)
当我们设置该 Calendar 为 Lenient false 时,它会依据特定的月份检查出错误的赋值。
Calendar 与 Date 的转换
Calendar calendar = Calendar.getInstance();
// 从一个Calendar对象中获取Date对象
Date date = calendar.getTime();
// 将 Date 对象反应到一个 Calendar 对象中,
// Calendar/GregorianCalendar没有构造函数可以接受Date对象,所以我们必需先获得一个实例,然后设置Date 对象
calendar.setTime(date);
Java Calendar 类时间操作,代码很简单。
演示了获取时间,日期时间的累加和累减。
- package MyTest;
- /*
- * 演示 Calendar 的一般操作
- */
- import java.util.Date;
- import java.text.SimpleDateFormat;
- import java.text.DateFormat;
- import java.util.Calendar;
- public class Test
- {
- public Test()
- {
- }
- public static void main(String[] args)
- {
- // 字符串转换日期格式
- // DateFormat fmtDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- // 得到日期格式对象
- // Date date = fmtDateTime.parse(strDateMake);
- // 完整显示日期时间
- String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date());
- System.out.println(str);
- // 创建 Calendar 对象
- Calendar calendar = Calendar.getInstance();
- // 初始化 Calendar 对象,但并不必要,除非需要重置时间
- calendar.setTime(new Date());
- // setTime 类似上面一行
- // Date date = new Date();
- // calendar.setTime(date);
- // 显示年份
- int year = calendar.get(Calendar.YEAR);
- System.out.println("YEAR is = " + String.valueOf(year));
- // 显示月份 (从0开始, 实际显示要加一)
- int MONTH = calendar.get(Calendar.MONTH);
- System.out.println("MONTH is = " + (MONTH + 1));
- // 今年的第 N 天
- int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR);
- System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR);
- // 本月第 N 天
- int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH);
- System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH));
- // 3小时以后
- calendar.add(Calendar.HOUR_OF_DAY, 3);
- int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY);
- System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY);
- // 当前分钟数
- int MINUTE = calendar.get(Calendar.MINUTE);
- System.out.println("MINUTE = " + MINUTE);
- // 15 分钟以后
- calendar.add(Calendar.MINUTE, 15);
- MINUTE = calendar.get(Calendar.MINUTE);
- System.out.println("MINUTE + 15 = " + MINUTE);
- // 30分钟前
- calendar.add(Calendar.MINUTE, -30);
- MINUTE = calendar.get(Calendar.MINUTE);
- System.out.println("MINUTE - 30 = " + MINUTE);
- // 格式化显示
- str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
- System.out.println(str);
- // 重置 Calendar 显示当前时间
- calendar.setTime(new Date());
- str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
- System.out.println(str);
- // 创建一个 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));
- }