Java 简明教程
Java - Date and Time
Java 提供了 Date class 可用于 java.util package ,这个类封装了当前的日期和时间。
Date 类支持两种构造函数,如下表所示。
Sr.No. |
Constructor & Description |
1 |
Date( ) 该构造函数使用当前日期和时间初始化对象。 |
2 |
Date(long millisec) 该构造函数接收一个自 1970 年 1 月 1 日午夜以来的毫秒数。 |
以下是日期类的各个方法。
Sr.No. |
Method & Description |
1 |
boolean after(Date when) 该方法测试此日期是否在指定日期之后。 |
2 |
boolean before(Date when) 该方法测试此日期是否在指定日期之前。 |
3 |
Object clone() 该方法返回此对象的副本。 |
4 |
int compareTo(Date anotherDate) 该方法将两个 Date 进行比较以排序。 |
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 之后的时间毫秒数。 |
10 |
Instant toInstant() 该方法将此 Date 对象转换为一个 Instant。 |
11 |
String toString() 该方法将此 Date 对象转换为字符串形式。 |
Getting Current Date and Time
这是一种非常简单的方法,可以在 Java 中获取当前日期和时间。您可以使用带 toString() 方法的简单 Date 对象来打印当前日期和时间,如下所示:
Date Comparison
以下是比较两个日期的三种方法:
-
您可以使用 getTime() 为两个对象获取自 1970 年 1 月 1 日午夜以来经过的毫秒数,然后比较这两个值。
-
您可以使用 before()、after() 和 equals() 方法。例如,由于本月的 12 号在 18 号之前,new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回 true。
-
您可以使用 compareTo() 方法,该方法由 Comparable 接口定义并由 Date 实现。
Date Formatting Using SimpleDateFormat
SimpleDateFormat 是一个用于以区域敏感方式格式化和解析日期的具体类。通过 SimpleDateFormat,您可以首先为日期时间格式化选择任何用户定义的模式。
Example
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
Simple DateFormat Format Codes
要指定时间格式,请使用时间模式字符串。在此模式中,所有 ASCII 字母都保留为模式字母,定义如下:
Character |
Description |
Example |
G |
Era designator |
AD |
y |
Year in four digits |
2001 |
M |
Month in year |
July or 07 |
d |
Day in month |
10 |
h |
Hour in A.M./P.M. (1~12) |
12 |
H |
Hour in day (0~23) |
22 |
m |
Minute in hour |
30 |
s |
Second in minute |
55 |
S |
Millisecond |
234 |
E |
Day in week |
Tuesday |
D |
Day in year |
360 |
F |
本月的星期几 |
2(七月的第二个星期三) |
w |
Week in year |
40 |
W |
Week in month |
1 |
a |
A.M./P.M. marker |
PM |
k |
Hour in day (1~24) |
24 |
K |
Hour in A.M./P.M. (0~11) |
10 |
z |
Time zone |
Eastern Standard Time |
' |
Escape for text |
Delimiter |
" |
Single quote |
` |
Date Formatting Using printf
可以使用 printf 方法非常轻松地完成日期和时间格式化。您使用一个两位格式,从 t 开始,以表格中列出的一个字母结尾,如下面的代码所示。
Example
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and 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
如果您必须多次提供日期以格式化每个部分,那会有点愚蠢。因此,格式字符串可以指示要格式化的参数的索引。
索引必须紧跟 %,并且必须以 $ 结尾。
Example
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
}
}
这会产生以下结果 −
Due date: February 09, 2004
或者,您可以使用 < 标志。它表示应再次使用与前一个格式规范中相同的参数。
Date and Time Conversion Characters
Character |
Description |
Example |
c |
Complete date and time |
2009 年 5 月 04 日星期一上午 9:51:52 中部夏令时间 |
F |
ISO 8601 date |
2004-02-09 |
D |
U.S. formatted date (month/day/year) |
02/09/2004 |
T |
24-hour time |
18:05:19 |
r |
12-hour time |
06:05:19 pm |
R |
24-hour time, no seconds |
18:05 |
Y |
四位数年份(前导零) |
2004 |
y |
年份的最后两位数字(前导零) |
04 |
C |
年份的前两位数字(带有前导零) |
20 |
B |
Full month name |
February |
b |
Abbreviated month name |
Feb |
m |
两位数字的月份(带有前导零) |
02 |
d |
两位数字的日期(带有前导零) |
03 |
e |
两位数字的日期(不带有前导零) |
9 |
A |
Full weekday name |
Monday |
a |
Abbreviated weekday name |
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 |
从 GMT 开始的 RFC 822 数字偏移 |
-0800 |
Z |
Time zone |
PST |
s |
自 1970 年 1 月 1 日 00:00:00 GMT 经过的秒数 |
1078884319 |
Q |
自 1970 年 1 月 1 日 00:00:00 GMT 经过的毫秒数 |
1078884319047 |
还有其他与日期和时间相关的实用类。如需了解更多详细信息,请参阅 Java 标准文档。
Parsing Strings into Dates
SimpleDateFormat 类有一些其他方法,尤其是 parse( ),它尝试根据给定 SimpleDateFormat 对象中存储的格式解析字符串。
Example
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
Sleeping for a While
您可以从一毫秒到计算机的生命周期中的任意时间段内休眠。例如,以下程序将休眠 3 秒:
Example
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 (Exception e) {
System.out.println("Got an exception!");
}
}
}
这会产生以下结果 −
Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:51 GMT 2009
Measuring Elapsed Time
有时,您可能需要以毫秒为单位测量时间点。所以让我们再次重写上面的示例:
Example
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 (Exception 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 Class
GregorianCalendar 是 Calendar 类的具体实现,它实现了您熟悉的标准公历。我们在本教程中没有讨论过 Calendar 类,您可以查阅标准 Java 文档。
Calendar 的 getInstance( ) 方法返回一个 GregorianCalendar,该方法使用默认区域设置和时区初始化当前日期和时间。GregorianCalendar 定义了两个字段:AD 和 BC。它们表示公历定义的两个纪元。
还有多个 GregorianCalendar 对象的构造函数:
Sr.No. |
Constructor & Description |
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 类提供的几个有用的支持方法:
Sr.No. |
Method & Description |
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() 以 long 格式获取此 Calendar 的当前时间。 |
14 |
TimeZone getTimeZone() 获取时区。 |
15 |
int getMinimum(int field) 返回给定字段的最小值。 |
16 |
int hashCode() Overrides 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) 设置公历更改日期。 |
24 |
void setTime(Date date) 使用给定的日期设置此日历的当前时间。 |
25 |
void setTimeInMillis(long millis) 使用给定的长值设置此日历的当前时间。 |
26 |
void setTimeZone(TimeZone value) 使用给定的时区值设置时区。 |
27 |
String toString() 返回此日历的字符串表示形式。 |
Example
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;
// Create a Gregorian calendar initialized
// with the current date and time in the
// default locale and timezone.
GregorianCalendar gcalendar = new GregorianCalendar();
// Display current time and date information.
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));
// Test if the current year is a leap year
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 标准文档。