Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java APIs 和框架

Java 類引用

Java 有用資源

Java - 日期和時間



Java 提供了可在 java.util 中使用的 Date,此類封裝了當前日期和時間。

Date 類支援如下表所示的兩個建構函式。

序號 建構函式和描述
1

Date( )

此建構函式使用當前日期和時間初始化物件。

2

Date(long millisec)

此建構函式接受一個引數,該引數等於自 1970 年 1 月 1 日午夜以來的毫秒數。

以下是 Date 類的其他方法。

序號 方法和描述
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()

此方法返回自 1970 年 1 月 1 日 00:00:00 GMT 以來的毫秒數,由此 Date 物件表示。

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 物件轉換為以下形式的字串。

獲取當前日期和時間

這是一種在 Java 中獲取當前日期和時間非常簡單的方法。可以使用帶有 toString() 方法的簡單 Date 物件來列印當前日期和時間,如下所示:

示例

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

日期比較

以下是比較兩個日期的三種方法:

  • 可以使用 getTime( ) 獲取自 1970 年 1 月 1 日午夜以來兩個物件的毫秒數,然後比較這兩個值。

  • 可以使用 before( )、after( ) 和 equals( ) 方法。例如,由於月份的第 12 天在第 18 天之前,因此 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 紀元指示符 公元
y 四位數年份 2001
M 月份 七月或 07
d 10
h 小時 (1~12) 12
H 小時 (0~23) 22
m 分鐘 30
s 55
S 毫秒 234
E 星期幾 星期二
D 一年中的第幾天 360
F 一個月中的星期幾 2 (七月的第二個星期三)
w 一年中的第幾周 40
W 一個月中的第幾周 1
a 上午/下午標記 下午
k 小時 (1~24) 24
K 小時 (0~11) 10
z 時區 東部標準時間
' 轉義文字 分隔符
" 單引號 `

使用 printf 進行日期格式化

可以使用 printf 方法非常輕鬆地進行日期和時間格式化。可以使用以 t 開頭並以表格中的一個字母結尾的兩個字母格式,如下面的程式碼所示。

示例

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

如果必須多次提供日期來格式化每個部分,那就有點愚蠢了。因此,格式字串可以指示要格式化的引數的索引。

索引必須緊跟在 % 之後,並且必須以 $ 結尾。

示例

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

或者,可以使用 < 標誌。它指示應再次使用與前面格式規範相同的引數。

示例

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

日期和時間轉換字元

字元 描述 示例
c 完整的日期和時間 2009年5月4日星期一 09:51:52 CDT
F ISO 8601 日期格式 2004-02-09
D 美國日期格式 (月/日/年) 02/09/2004
T 24小時制時間 18:05:19
r 12小時制時間 下午06:05:19
R 24小時制時間,無秒 18:05
Y 四位數年份(帶前導零) 2004
y 年份的後兩位數(帶前導零) 04
C 年份的前兩位數(帶前導零) 20
B 月份全稱 二月
b 月份縮寫 Feb
m 兩位數月份(帶前導零) 02
d 兩位數日期(帶前導零) 03
e 兩位數日期(無前導零) 9
A 星期幾全稱 星期一
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 上午或下午標記(大寫) 下午
p 上午或下午標記(小寫) pm
z RFC 822 格林尼治標準時間數值偏移 -0800
Z 時區 PST
s 自1970-01-01 00:00:00 GMT以來的秒數 1078884319
Q 自1970-01-01 00:00:00 GMT以來的毫秒數 1078884319047

還有其他與日期和時間相關的有用類。更多詳情,請參考Java標準文件。

將字串解析為日期

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

暫停一段時間

您可以暫停從一毫秒到計算機壽命的任何時間段。例如,以下程式將暫停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 (Exception 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 (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 類

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()

獲取此日曆的當前時間。

13

long getTimeInMillis()

獲取此日曆的當前時間(長整型)。

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)

設定格里高利曆更改日期。

24

void setTime(Date date)

使用給定的日期設定此日曆的當前時間。

25

void setTimeInMillis(long millis)

使用給定的長整型值設定此日曆的當前時間。

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;
      // 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 文件。

廣告