位置:首頁 > Java技術 > Java基礎教程 > Java日期時間(Date/Time)

Java日期時間(Date/Time)

Java在java.util包中提供了Date類,這個類封裝了當前的日期和時間。

Date類支持兩種構造函數。第一個構造函數初始化對象的當前日期和時間。

Date( )

下麵的構造函數接受一個參數等於自午夜,1970年1月1日起已經過的毫秒數

Date(long millisec)

一旦有一個日期對象,可以調用以下任何一種支持的方法和時間:

SN 方法和描述
1 boolean after(Date date)
如果調用Date對象包含或晚於指定的日期則返回true,否則,返回false。
2 boolean before(Date date)
如果調用Date對象包含或早於日期指定的日期返回true,否則,返回false。
3 Object clone( )
重複調用Date對象。
4 int compareTo(Date date)
比較日期的調用對象的值。如果這兩個值相等返回0。如果調用對象是早於日期返回一個負值。如果調用對象最遲日期返回正值。
5 int compareTo(Object obj)
操作以相同的compareTo(Date) 如果obj是一個類日期。否則,它會拋出一個ClassCastException。
6 boolean equals(Object date)
如果調用Date對象包含相同的時間及日期指定日期則返回true,否則,返回false。
7 long getTime( )
返回自1970年1月1日起已經過的毫秒數。
8 int hashCode( )
返回調用對象的哈希代碼。
9 void setTime(long time)
設置所指定的時間,這表示經過時間以毫秒為單位,1970年1月1日從午夜的時間和日期
10 String toString( )
調用Date對象轉換為字符串,並返回結果。

獲取當前日期和時間

在Java中容易得到當前的日期和時間。可以使用一個簡單的Date對象的toString()方法,如下所示打印當前日期和時間:

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

這將產生以下結果:

Mon May 04 09:51:52 CDT 2009

日期比較:

有以下三種方式來比較兩個日期:

  • 可以使用getTime() 來獲得自1970年1月1日午夜十二時,起已經過的毫秒數,然後比較兩個對象的值。

  • 可以使用 before( ), after( ), and equals( ),由於本月12日來的18日前,例如, new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回 true。

  • 可以使用compareTo()方法,這是由Comparable接口定義和日期執行。

使用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

簡單的DateFormat格式代碼:

要指定時間格式,使用時間模式字符串。在這個模式中,所有的ASCII字母被保留為模式字母,其定義如下:

Character 描述 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 Day of week in month 2 (second Wed. in July)
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 `

用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 using toString()
     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 using toString()
       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 Complete date and time Mon May 04 09:51:52 CDT 2009
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 Four-digit year (with leading zeroes) 2004
y Last two digits of the year (with leading zeroes) 04
C First two digits of the year (with leading zeroes) 20
B Full month name February
b Abbreviated month name Feb
m Two-digit month (with leading zeroes) 02
d Two-digit day (with leading zeroes) 03
e Two-digit day (without leading zeroes) 9
A Full weekday name Monday
a Abbreviated weekday name Mon
j Three-digit day of year (with leading zeroes) 069
H Two-digit hour (with leading zeroes), between 00 and 23 18
k Two-digit hour (without leading zeroes), between 0 and 23 18
I Two-digit hour (with leading zeroes), between 01 and 12 06
l Two-digit hour (without leading zeroes), between 1 and 12 6
M Two-digit minutes (with leading zeroes) 05
S Two-digit seconds (with leading zeroes) 19
L Three-digit milliseconds (with leading zeroes) 047
N Nine-digit nanoseconds (with leading zeroes) 047000000
P Uppercase morning or afternoon marker PM
p Lowercase morning or afternoon marker pm
z RFC 822 numeric offset from GMT -0800
Z Time zone PST
s Seconds since 1970-01-01 00:00:00 GMT 1078884319
Q Milliseconds since 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); 
      }
   }
}

上述程序的運行示例將產生以下結果:

$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

休眠一會:

可以在任何期間的時間休眠從一個毫秒。例如,下麵的程序會休眠10秒:

import java.util.*;
  
public class SleepDemo {
   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "
"); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + "
"); 
      } 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( ) + "
");
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "
");
         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類,可以看看標準Java文檔。

Calendar的getInstance()方法返回與當前日期和時間默認語言環境和時區初始化一個GregorianCalendar。 GregorianCalendar中定義了兩個字段:AD和BC。這些代表在公曆中定義的兩個時代。

也有幾個構造函數的GregorianCalendar對象:

SN  構造函數描述
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類提供一些有用的支持方法的列表:

SN 方法和描述
1 void add(int field, int amount) 
添加指定(有符號的)時間量,以給定的時間字段,基於日曆的規則。
2 protected void computeFields() 
將UTC轉換為毫秒時間字段值.
3 protected void computeTime() 
覆蓋日曆轉換時間域值為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) 
設置GregorianCalendar更改日期.
24 void setTime(Date date) 
設置日曆的當前時間與給定日期.
25 void setTimeInMillis(long millis) 
從給定long值設置日曆的當前時間.
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文檔。