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 对象来打印当前日期和时间,如下所示:

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 using toString()
      System.out.println(date.toString());
   }
}

这会产生以下结果 −

on May 04 09:51:52 CDT 2009

Date Comparison

以下是比较两个日期的三种方法:

  1. 您可以使用 getTime() 为两个对象获取自 1970 年 1 月 1 日午夜以来经过的毫秒数,然后比较这两个值。

  2. 您可以使用 before()、after() 和 equals() 方法。例如,由于本月的 12 号在 18 号之前,new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回 true。

  3. 您可以使用 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

或者,您可以使用 < 标志。它表示应再次使用与前一个格式规范中相同的参数。

Example

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display formatted date
      System.out.printf("%s %tB %<te, %<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 标准文档。