Java 提供了 java.util.Date
类来封装当前日期和时间信息。Date
类支持两种构造函数,如下表所示:
构造函数
序号 |
构造函数 |
描述 |
1 |
Date() |
此构造函数初始化对象为当前日期和时间。 |
2 |
Date(long millisec) |
此构造函数接受一个参数,表示自1970年1月1日午夜以来经过的毫秒数。 |
Date
类的方法
以下为 Date
类中提供的方法列表:
序号 |
方法 |
描述 |
1 |
boolean after(Date when) |
测试此日期是否在指定日期之后。 |
2 |
boolean before(Date when) |
测试此日期是否在指定日期之前。 |
3 |
Object clone() |
返回此对象的一个副本。 |
4 |
int compareTo(Date anotherDate) |
比较两个日期以进行排序。 |
5 |
boolean equals(Object obj) |
比较两个日期是否相等。 |
6 |
static Date from(Instant instant) |
从 Instant 对象获取 Date 实例。 |
7 |
long getTime() |
返回此 Date 对象表示的时间,单位为自1970年1月1日00:00:00 GMT 以来的毫秒数。 |
8 |
int hashCode() |
返回此对象的哈希码值。 |
9 |
void setTime(long time) |
将此 Date 对象设置为表示自1970年1月1日00:00:00 GMT 以来的 time 毫秒的时间点。 |
10 |
Instant toInstant() |
将此 Date 对象转换为 Instant 。 |
11 |
String toString() |
将此 Date 对象转换为字符串形式。 |
获取当前日期和时间
获取当前日期和时间是一个非常简单的过程。可以通过创建一个简单的 Date
对象,并调用其 toString()
方法来打印当前日期和时间,如下面的例子所示:
示例
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
Date date = new Date();
System.out.println(date.toString());
}
}
这将产生如下输出:
May 04 09:51:52 CDT 2009
日期比较
以下是三种比较两个日期的方法:
-
可以使用
getTime()
获取自1970年1月1日午夜以来经过的毫秒数,然后比较这两个值。
-
可以使用
before()
, after()
, 和 equals()
方法。例如,由于一月十二日早于一月十八日,所以 new Date(99, 2, 12).before(new Date (99, 2, 18))
返回 true
。
-
可以使用
compareTo()
方法,这是由 Comparable
接口定义并在 Date
类中实现的。
使用 SimpleDateFormat
进行日期格式化
SimpleDateFormat
是一个具体的类,用于按照与地区相关的格式格式化和解析日期。SimpleDateFormat
允许用户定义日期时间格式模式。
示例
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
}
}
这将产生如下输出:
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
SimpleDateFormat
格式代码
为了指定时间格式,可以使用包含所有ASCII字母作为模式字母的时间模式字符串,这些模式字母定义如下:
字符 |
描述 |
示例 |
G |
时代标志 |
AD |
y |
四位数的年份 |
2001 |
M |
年中的月份 |
July 或 07 |
d |
月中的天数 |
10 |
h |
A.M./P.M. 时间(1~12) |
12 |
H |
一天中的小时(0~23) |
22 |
m |
分钟 |
30 |
s |
秒 |
55 |
S |
毫秒 |
234 |
E |
周中的日期 |
Tuesday |
D |
年中的天数 |
360 |
F |
月中的周几 |
2(七月的第二个星期三) |
w |
年中的周数 |
40 |
W |
月中的周数 |
1 |
a |
A.M./P.M. 标记 |
PM |
k |
一天中的小时(1~24) |
24 |
K |
A.M./P.M. 时间(0~11) |
10 |
z |
时区 |
Eastern Standard Time |
使用 printf
进行日期格式化
可以非常容易地使用 printf
方法进行日期和时间的格式化。使用以 t
开头并以表格中一个字母结尾的两位字符格式。
示例
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
Date date = new Date();
String str = String.format("Current Date/Time : %tc", date);
System.out.printf(str);
}
}
这将产生如下输出:
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
如果需要多次提供日期来格式化每个部分,会显得有些多余。因此,格式字符串可以指示要格式化的参数的索引。
索引必须紧跟在 %
后面,并且必须以 $
结束。
示例
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
Date date = new Date();
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
}
}
这将产生如下输出:
Due date: February 09, 2004
或者,可以使用 <
标志。它指示应该再次使用前一个格式说明符中的相同参数。
示例
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
Date date = new Date();
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
}
}
这将产生如下输出:
Due date: February 09, 2004
日期和时间转换字符
字符 |
描述 |
示例 |
c |
完整的日期和时间 |
Mon May 04 09:51:52 CDT 2009 |
F |
ISO 8601 日期 |
2004-02-09 |
D |
美国格式日期(月/日/年) |
02/09/2004 |
T |
24小时制时间 |
18:05:19 |
r |
12小时制时间 |
06:05:19 pm |
R |
24小时制时间,无秒 |
18:05 |
Y |
四位数的年份(带前导零) |
2004 |
y |
年份的最后两位(带前导零) |
04 |
C |
年份的第一两位(带前导零) |
20 |
B |
完整的月份名称 |
February |
b |
缩写的月份名称 |
Feb |
m |
两位数字的月份(带前导零) |
02 |
d |
两位数字的日期(带前导零) |
03 |
e |
两位数字的日期(无前导零) |
9 |
A |
完整的星期名称 |
Monday |
a |
缩写的星期名称 |
Mon |
j |
三位数字的年份中的日期(带前导零) |
069 |
H |
两位数字的小时(带前导零),介于00和23之间 |
18 |
k |
两位数字的小时(无前导零),介于0和23之间 |
18 |
I |
两位数字的小时(带前导零),介于01和12之间 |
06 |
l |
两位数字的小时(无前导零),介于1和12之间 |
6 |
M |
两位数字的分钟(带前导零) |
05 |
S |
两位数字的秒(带前导零) |
19 |
L |
三位数字的毫秒(带前导零) |
047 |
N |
九位数字的纳秒(带前导零) |
047000000 |
P |
大写上午或下午标记 |
PM |
p |
小写上午或下午标记 |
pm |
z |
RFC 822 数字偏移量 |
-0800 |
Z |
时区 |
PST |
s |
自1970年1月1日00:00:00 GMT以来的秒数 |
1078884319 |
Q |
自1970年1月1日00:00:00 GMT以来的毫秒数 |
1078884319047 |
解析字符串为日期
SimpleDateFormat
类有一些附加的方法,特别是 parse()
方法,尝试根据给定的 SimpleDateFormat
对象中存储的格式解析一个字符串。
示例
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
该程序的一次运行示例将产生如下输出:
1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818
在 Java 中暂停一段时间
您可以暂停任何时间段,从一毫秒到计算机的寿命都可以。例如,下面的程序将暂停 3 秒钟:
示例
import java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date() + "\n");
Thread.sleep(5 * 60 * 10);
System.out.println(new Date() + "\n");
} catch (InterruptedException e) {
System.out.println("Got an exception!");
}
}
}
这将产生如下结果:
Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:51 GMT 2009
测量经过的时间
有时候,您可能需要测量某个时间点,单位为毫秒。让我们重写上面的例子:
示例
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis();
System.out.println(new Date() + "\n");
Thread.sleep(5 * 60 * 10);
System.out.println(new Date() + "\n");
long end = System.currentTimeMillis();
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (InterruptedException e) {
System.out.println("Got an exception!");
}
}
}
这将产生如下结果:
Sun May 03 18:16:51 GMT 2009
Sun May 03 18:16:57 GMT 2009
Difference is : 5993
GregorianCalendar
类
GregorianCalendar
是 Calendar
类的一个具体实现,它实现了您所熟悉的格里高利历法。我们在本教程中没有讨论 Calendar
类,您可以查阅标准的 Java 文档了解相关信息。
Calendar
类的 getInstance()
方法返回一个初始化为默认语言环境和时区的当前日期和时间的 GregorianCalendar
。GregorianCalendar
定义了两个字段:AD
和 BC
。它们代表了格里高利历定义的两个时代。
GregorianCalendar
也有几个构造函数:
序号 |
构造函数 |
描述 |
1 |
GregorianCalendar() |
使用默认时区和语言环境构造一个默认的 GregorianCalendar 。 |
2 |
GregorianCalendar(int year, int month, int date) |
使用给定的日期,在默认时区和语言环境中构造一个 GregorianCalendar 。 |
3 |
GregorianCalendar(int year, int month, int date, int hour, int minute) |
使用给定的日期和时间,在默认时区和语言环境中构造一个 GregorianCalendar 。 |
4 |
GregorianCalendar(int year, int month, int date, int hour, int minute, int second) |
使用给定的日期和时间,在默认时区和语言环境中构造一个 GregorianCalendar 。 |
5 |
GregorianCalendar(Locale aLocale) |
使用默认时区和给定的语言环境构造一个 GregorianCalendar 。 |
6 |
GregorianCalendar(TimeZone zone) |
使用给定的时区和默认语言环境构造一个 GregorianCalendar 。 |
7 |
GregorianCalendar(TimeZone zone, Locale aLocale) |
使用给定的时区和语言环境构造一个 GregorianCalendar 。 |
以下是 GregorianCalendar
类提供的几个有用的辅助方法:
序号 |
方法 |
描述 |
1 |
void add(int field, int amount) |
根据日历规则向给定的时间字段添加指定的数量。 |
2 |
protected void computeFields() |
将作为毫秒的 UTC 转换为时间字段值。 |
3 |
protected void computeTime() |
重写 Calendar ,将时间字段值转换为作为毫秒的 UTC。 |
4 |
boolean equals(Object obj) |
将此 GregorianCalendar 与对象引用进行比较。 |
5 |
int get(int field) |
获取给定时间字段的值。 |
6 |
int getActualMaximum(int field) |
返回给定日期下该字段可能的最大值。 |
7 |
int getActualMinimum(int field) |
返回给定日期下该字段可能的最小值。 |
8 |
int getGreatestMinimum(int field) |
如果字段可变,则返回给定字段的最高最小值。 |
9 |
Date getGregorianChange() |
获取格里高利历更改日期。 |
10 |
int getLeastMaximum(int field) |
如果字段可变,则返回给定字段的最低最大值。 |
11 |
int getMaximum(int field) |
返回给定字段的最大值。 |
12 |
Date getTime() |
获取此 Calendar 的当前时间。 |
13 |
long getTimeInMillis() |
获取此 Calendar 的当前时间(作为长整型)。 |
14 |
TimeZone getTimeZone() |
获取时区。 |
15 |
int getMinimum(int field) |
返回给定字段的最小值。 |
16 |
int hashCode() |
重写 hashCode 方法。 |
17 |
boolean isLeapYear(int year) |
判断给定年份是否为闰年。 |
18 |
void roll(int field, boolean up) |
在给定的时间字段上加或减单个时间单位而不改变较大的字段。 |
19 |
void set(int field, int value) |
设置给定值的时间字段。 |
20 |
void set(int year, int month, int date) |
设置年、月、日字段的值。 |
21 |
void set(int year, int month, int date, int hour, int minute) |
设置年、月、日、时、分字段的值。 |
22 |
void set(int year, int month, int date, int hour, int minute, int second) |
设置年、月、日、时、分、秒字段的值。 |
23 |
void setGregorianChange(Date date) |
设置 GregorianCalendar 更改日期。 |
24 |
void setTime(Date date) |
使用给定的 Date 设置此 Calendar 的当前时间。 |
25 |
void setTimeInMillis(long millis) |
使用给定的长整型值设置此 Calendar 的当前时间。 |
26 |
void setTimeZone(TimeZone value) |
使用给定的时区值设置时区。 |
27 |
String toString() |
返回此日历的字符串表示形式。 |
示例
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int year;
GregorianCalendar gcalendar = new GregorianCalendar();
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
if(gcalendar.isLeapYear(year)) {
System.out.println("The current year is a leap year");
} else {
System.out.println("The current year is not a leap year");
}
}
}
这将产生如下结果:
Date: Apr 22 2009
Time: 11:25:27
The current year is not a leap year
对于 Calendar
类中可用的完整常量列表,请查阅标准的 Java 文档。