Calender的使用详解
Calendar的中文翻译是日历,实际上,在历史上有着许多种计时的方法。所以为了计时的统一,必需指定一个日历的选择。那现在最为普及和通用的日历就是”Gregorian Calendar”。也就是我们在讲述年份时常用”公元**年”。Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。Calendar.getInstance()中所获得的实例就是一个”GreogrianCalendar”对象。
Calendar获取时间的常见方法
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
|
import
java
.
util
.
Calendar
;
public
class
Test
{
public
static
void
main
(
String
[
]
args
)
{
Calendar
cal
=
Calendar
.
getInstance
(
)
;
int
year
=
cal
.
get
(
Calendar
.
YEAR
)
;
//比当前月份少1
int
month
=
cal
.
get
(
Calendar
.
MONTH
)
;
//date表示日期,day表示天数,所以date与day_of_month相同
int
date
=
cal
.
get
(
Calendar
.
DATE
)
;
int
dayOfMonth
=
cal
.
get
(
Calendar
.
DAY_OF_MONTH
)
;
//表示本周的第几天,从周日开始计算
int
dayOfWeek
=
cal
.
get
(
Calendar
.
DAY_OF_WEEK
)
;
int
dayOfYear
=
cal
.
get
(
Calendar
.
DAY_OF_YEAR
)
;
//12小时制
int
hour
=
cal
.
get
(
Calendar
.
HOUR
)
;
//24小时制
int
hourOfDay
=
cal
.
get
(
Calendar
.
HOUR_OF_DAY
)
;
int
minute
=
cal
.
get
(
Calendar
.
MINUTE
)
;
int
second
=
cal
.
get
(
Calendar
.
SECOND
)
;
int
millisecond
=
cal
.
get
(
Calendar
.
MILLISECOND
)
;
int
maxDate
=
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 如何处理的呢?
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
Test
{
public
static
void
main
(
String
[
]
args
)
throws
Exception
{
Calendar
cal
=
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);