Java 日期時間


java.util套件提供了Date類別來封裝目前的日期和時間。 Date類別提供兩個建構子來實例化Date物件。

第一個建構函式使用目前日期和時間來初始化物件。

Date( )

第二個建構子接收一個參數,該參數是從1970年1月1日起的毫秒數。

Date(long millisec)

Date物件建立以後,可以呼叫下面的方法。

                    序號                    方法與說明
                    1boolean after(Date date)
若當呼叫此方法的Date物件在指定日期之後傳回true,否則傳回false。
                    2boolean before(Date date)
若當呼叫此方法的Date物件在指定日期之前傳回true,否則傳回false。
                    3Object clone( )
# 傳回此物件的副本。
                    4int compareTo(Date date)
比較當呼叫此方法的Date物件和指定日期。兩者相等時候回傳0。呼叫物件在指定日期之前則傳回負數。呼叫物件在指定日期之後則傳回正數。
                    5int compareTo(Object obj)
若obj是Date類型則操作等同於compareTo(Date) 。否則它拋出ClassCastException。
                    6boolean equals(Object date)
當呼叫此方法的Date物件和指定日期相等時候傳回true,否則傳回false。
                    7long getTime( )
# 傳回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 物件表示的毫秒數。
                    8int hashCode( )
#  傳回此物件的雜湊碼值。
                    9void setTime(long time)
 
以自1970年1月1日00:00:00 GMT以後time毫秒數設定時間和日期。
                    10String toString( )
#轉換Date物件為String表示形式,並傳回該字串。

取得目前日期時間

Java中取得目前日期和時間很簡單,使用Date物件的toString()方法列印目前日期和時間,如下所示:

import java.util.Date;
  
public class DateDemo {
   public static void main(String args[]) {
       // 初始化 Date 对象
       Date date = new Date();
        
       // 使用 toString() 函数显示日期时间
       System.out.println(date.toString());
   }
}

以上實例編譯運行結果如下:

Mon May 04 09:51:52 CDT 2013

#日期比較

#Java使用以下三種方法來比較兩個日期:

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

簡單的DateFormat格式化編碼

#時間模式字串用來指定時間格式。在此模式中,所有的ASCII字母被保留為模式字母,定義如下:

#
字母描述#範例
                    G                    紀元標示                    AD
                    y                    四年份                    2001
                    M                    月份                    July or 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 (second Wed. in July)
                    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
                    '                    文字定界符                    Delimiter
                    "                    單引號                    `

使用printf格式化日期

printf方法可以輕鬆格式化時間和日期。使用兩個字母格式,它以t開頭並且以下面表格中的一個字母結尾。例如:

import java.util.Date;

public class DateDemo {

  public static void main(String args[]) {
     // 初始化 Date 对象
     Date date = new Date();

     // 使用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[]) {
       // 初始化 Date 对象
       Date date = new Date();
        
       // 使用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[]) {
       // 初始化 Date 对象
       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                    U.S. 格式日期 (月/日/年)                    02/09/2004
                    T                    24小時時間                    18:05:19
                    r                    12小時時間                    06:05:19 pm
                    R                    24小時時間,不含秒                    18:05
                    Y                    4位數年份(含前導0)                    2004
                    y                    年後2位(含前導0)                    04
                    C                    年前2位(含前導0)                    20
                    B                    月份全名                    February
                    b                    月份簡稱                    Feb
                    n                    2位元月份(含前導0)                    02
                    d                    2位數日子(含前導0)                    03
                    e                    2位數日子(不含前導0)                    9
                    A                    星期全名                    Monday
                    a                    星期簡稱                    Mon
                    j                    3位數年份(含前導0)                    069
                    H                    2位元小時(含前導0), 00 到 23                    18
                    k                    2位元小時(不含前導0),  0 至 23                    18
                    I                    2位元小時(含前導0), 01 到 12                    06
                    l                    2位元小時(不含前導0),  1 至 12                    6
                    M                    2位數分鐘(含前導0)                    05
                    S                    2位元秒數(含前導0)                    19
                    L                    3位元毫秒(含前導0)                    047
                    N                    9位元奈秒(含前導0)                    047000000
                    P                    大寫上下午標誌                    PM
                    p                    小寫上下午標誌                    pm
                    z                    從GMT的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); 
      }
   }
}

以上實例編譯運行結果如下:

$ 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

Java 休眠(sleep)

sleep()使目前執行緒進入停滯狀態(阻塞目前執行緒),讓出CPU的使用、目的是不讓目前執行緒獨自霸占該行程所獲的CPU資源,以留一段時間給其他執行緒執行的機會。

你可以讓程式休眠一毫秒的時間或到您的電腦的壽命長的任意一段時間。例如,下面的程式會休眠3秒:

import java.util.*;
  
public class SleepDemo {
   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(1000*3);   // 休眠3秒
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) { 
          System.out.println("Got an exception!"); 
      }
   }
}

#以上實例編譯運行結果如下:

Thu Sep 17 10:20:30 CST 2015

Thu Sep 17 10:20:33 CST 2015


。 #下面的一個例子顯示如何測量時間間隔(以毫秒為單位):
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!");
      }
   }
}
#以上實例編譯運行結果如下:
Fri Jan 08 09:48:47 CST 2016

Fri Jan 08 09:48:50 CST 2016

Difference is : 3019
Calendar類別我們現在已經能夠格式化並創建一個日期物件了,但是我們如何才能設定和獲取日期資料的特定部分呢,比如說小時,日,或者分鐘?我們又如何在日期的這些部分加上或減去價值呢? 答案是使用Calendar 類別。 Calendar類別的功能比Date類別強大很多,而且在實作方式上也比Date類別複雜一些。 Calendar類別是一個抽象類,在實際使用時實作特定的子類別的對象,而建立物件的過程對程式設計師來說是透明的,只需要使用getInstance方法建立。 建立一個代表系統目前日期的Calendar物件
Calendar c = Calendar.getInstance();//默认是当前日期
建立一個指定日期的Calendar物件使用Calendar類別代表特定的時間,需要先建立一個Calendar的對象,然後再設定該物件中的年月日參數來完成。 Calendar類別物件欄位類型Calendar類別中用這些常數表示不同的意義,jdk內的許多類別其實都是採用的這種想法
//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);
##### ########常數######描述############Calendar.YEAR######年份################################################################### Calendar.MONTH######月份############Calendar.DATE######日期############Calendar.DAY_OF_MONTH#### ###日期,和上面的字段意義完全相同############Calendar.HOUR######12小時制的小時############ Calendar.HOUR_OF_DAY######24小時制的小時#############Calendar.MINUTE#####分鐘#############Calendar. SECOND######秒############Calendar.DAY_OF_WEEK######星期幾###########

Calendar類別物件資訊的設定

Set設定

#如:

Calendar c1 = Calendar.getInstance();

呼叫:

public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12

利用欄位類型設定

如果只設定某個字段,例如日期的值,則可以使用如下set方法:

public void set(int field,int value)

把c1物件代表的日期設為10號,其它所有的數值會被重新計算

c1.set(Calendar.DATE,10);

把c1物件代表的年份設定為2008年,其他的所有數值會被重新計算

c1.set(Calendar.YEAR,2008);

其他欄位屬性set的意義以此類推

#Add設定

Calendar c1 = Calendar.getInstance();

把c1物件的日期加上10,也就是c1也就表示為10天後的日期,其它所有的數值會被重新計算

c1.add(Calendar.DATE, 10);

把c1物件的日期減去10,也就是c1也就表示為10天前的日期,其它所有的數值會被重新計算

<pre>c1.add(Calendar.DATE, -10);

其他字段屬性的add的意義以此類推

Calendar類別物件資訊的取得

Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

GregorianCalendar類別

Calendar類別實作了公曆日曆,GregorianCalendar是Calendar類別的一個具體實作。

Calendar 的getInstance()方法傳回一個預設用目前的語言環境和時區初始化的GregorianCalendar物件。 GregorianCalendar定義了兩個欄位:AD和BC。這些代表公曆定義的兩個時代。

下面列出GregorianCalendar物件的幾個建構方法:

序號建構函數與說明
                   1GregorianCalendar()
# 在具有預設語言環境的預設時區內使用目前時間建構一個預設的 GregorianCalendar。
                    2GregorianCalendar(int year, int month, int date)
在預設語言環境的預設時區內建構一個有給定日期設定的 GregorianCalendar
                    3GregorianCalendar(int year, int month, int date, int hour, int minute)
# 為具有預設語言環境的預設時區建構一個具有給定日期和時間設定的 GregorianCalendar。
                    4GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
  為具有預設語言環境的預設時區建構一個具有給定日期和時間設定的 GregorianCalendar。
                    5GregorianCalendar(Locale aLocale)
在具有給定語言環境的預設時區內建構一個基於當前時間的 GregorianCalendar。
                    6GregorianCalendar(TimeZone zone)
在具有預設語言環境的給定時區內建構一個基於當前時間的 GregorianCalendar。
                    7GregorianCalendar(TimeZone zone, Locale aLocale)
 在具有給定語言環境的給定時區內建構一個基於當前時間的 GregorianCalendar。

這裡是GregorianCalendar 類別提供的一些有用的方法清單:

序號方法與說明
                    1void add(int field, int amount)
# 根據日曆規則,將指定的(有符號的)時間量加到給定的日曆欄位中。
                    2protected void computeFields()
# 轉換UTC毫秒值為時間域值
                    3protected void computeTime()
覆寫Calendar ,轉換時間域值為UTC毫秒值
                    4boolean equals(Object obj)
比較此 GregorianCalendar 與指定的 Object。
                    5int get(int field)
取得指定欄位的時間值
                    6int getActualMaximum(int field)
# 返回目前日期,給定欄位的最大
                    7int getActualMinimum(int field)
# 傳回目前日期,給定欄位的最小值
                    8int getGreatestMinimum(int field)
#  傳回此 GregorianCalendar 實例給定日曆欄位的最高的最小值。
                    9Date getGregorianChange()
獲得格里高利歷的更改日期。
                    10int getLeastMaximum(int field)
# 傳回此 GregorianCalendar 執行個體給定行事曆欄位的最低的最大值
                    11int getMaximum(int field)
傳回此 GregorianCalendar 實例的給定日曆欄位的最大值。
                    12Date getTime()
# 取得日曆目前時間。
                    13long getTimeInMillis()
取得長整數表示的行事曆的目前時間
                    14TimeZone getTimeZone()
取得時區。
                    15int getMinimum(int field)
傳回給定欄位的最小值。
              &