程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java時間相關內容學習(3) Date

Java時間相關內容學習(3) Date

編輯:關於JAVA

本章主要介紹Date類,並通過示例學習如何使用它。最後,講解一下UTC、GMT和時區的關系。

Date 介紹

Date 定義

public class Date implements java.io.Serializable, Cloneable, Comparable<Date> {}

Date 是表示時間的類。
一個Date對象表示一個特定的瞬間,能精確到毫秒。我們可以通過這個特定的瞬間,來獲取到Date對應的“年、月、日、時、分、秒”。反之亦然,我們也可以通過設置Date的“年、月、日、時、分、秒”等信息,來改變Date所指定的特定瞬間。
除了“年月日時分秒”等信息之外,Data也允許格式化和解析日期字符串。即,我們可以定義一個字符串,這個字符串包含時間信息,然後將字符串通過Date來解析,從而得到相應的Date對象。

在 JDK 1.1 之前,通常是通過Data操作“年月日時分秒”。不過,由於Date的相關 API 不易於實現國際化。從 JDK 1.1 開始,應該使用 Calendar 類來操作“年月日時分秒”,同時可以通過 DateFormat 類來格式化和解析日期字符串。Date 中的相應方法已廢棄。

Date和Calendar相互轉換

(01) Date轉換為Calendar

// 新建date,且日期/時間為2013-09-19 14:22:30
Date date = new Date(113, 8, 19, 14, 22, 30);
// 新建Calendar對象,並設置日期為date
Calendar cal = Calendar.getInstance();
cal.setTime(date);

(02) Calendar換為Date

// 新建Calendar對象
Calendar cal = Calendar.getInstance();
// 獲取Calendar對應的Date
Date date = cal.getTime();

Date 函數列表

Date 共包含下面5個構造函數
 

// Date構造函數一:傳入“年、月、日”
// (01) 年 -- 減 1900 的年份。若要設為1988,則“年”應該是88。
// (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
// (03) 日 -- 1-31 之間的某一天。
Date(int year, int month, int day)
     
// Date構造函數二:傳入“年、月、日、時、分”
// (01) 年 -- 減 1900 的年份。若要設為1988,則“年”應該是88。
// (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
// (03) 日 -- 1-31 之間的某一天。
// (04) 時 -- 0-23 之間的小時數。
// (05) 分 -- 0-59 之間的分鐘數。
Date(int year, int month, int day, int hour, int minute)
     
// Date構造函數三:傳入“年、月、日、時、分、秒”
// (01) 年 -- 減 1900 的年份。若要設為1988,則“年”應該是88。
// (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
// (03) 日 -- 1-31 之間的某一天。
// (04) 時 -- 0-23 之間的小時數。
// (05) 分 -- 0-59 之間的分鐘數。
// (06) 秒 -- 0-59 之間的秒鐘數。
Date(int year, int month, int day, int hour, int minute, int second)
     
// Date構造函數四:傳入“毫秒”。 毫秒 = “目標時間” - “1970-01-01 00:00:00 GMT”
Date(long milliseconds)
     
// Date構造函數五:傳入“字符串”。
Date(String string)

Date的操作API

// 根據參數確定日期和時間。這些參數被解釋為年份、月份、月中某一天、一天中的某一小時、小時中某一分鐘和分鐘中的某一秒。
static long     UTC(int year, int month, int day, int hour, int minute, int second)
// 此日期是否在指定日期之後。
boolean     after(Date date)
// 此日期是否在指定日期之前
boolean     before(Date date)
// 返回此對象的副本。
Object     clone()
// 比較兩個日期的順序。
int     compareTo(Date date)
// 比較兩個日期是否相等。
boolean     equals(Object object)
// 返回此 Date 對象表示的月份中的某一天。返回的值在 1 和 31 之間,表示包含或開始於此 Date 對象表示的時間的月份中的某一天(用本地時區進行解釋)。
int     getDate()
// 返回此日期表示的周中的某一天。返回值 (0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday) 表示一周中的某一天
int     getDay()
// 返回此 Date 對象表示的小時。返回值是一個數字(0 至 23)
int     getHours()
// 返回此日期所表示的小時已經過去的分鐘數(用本地時區進行解釋)。返回值在 0 和 59 之間。
int     getMinutes()
// 返回表示月份的數字,該月份包含或開始於此 Date 對象所表示的瞬間。返回的值在 0 和 11 之間。0為一月,1為二月,依次類推。
int     getMonth()
// 返回此日期所表示的分鐘已經過去的秒數。返回的值在 0 和 61 之間。值 60 和 61 只可能發生在考慮了閏秒的 Java 虛擬機上。
int     getSeconds()
// 返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。
long     getTime()
// 返回相對於 UTC(相應於此 Date 對象表示的時間)的本地時區的偏移量(以分鐘為單位)。
int     getTimezoneOffset()
// 返回一個值,此值是從包含或開始於此 Date 對象表示的瞬間的年份減去 1900 的結果(用本地時區進行解釋)。
int     getYear()
// 哈希值
int     hashCode()
// 把字符串 s 解釋為日期和時間的表示形式。
static long     parse(String string)
// 把此 Date 對象的月份中的某一天設置為指定值。
void     setDate(int day)
// 把此 Date 對象的小時設置為指定值。
void     setHours(int hour)
// 把此 Date 對象的分鐘數設置為指定值。
void     setMinutes(int minute)
// 把此日期的月份設置為指定值。0為一月,1為二月,依次類推。
void     setMonth(int month)
// 把此 Date 的秒數設置為指定值。
void     setSeconds(int second)
// 設置此 Date 對象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以後 time 毫秒的時間點。
void     setTime(long milliseconds)
// 把此 Date 對象的年份設置為指定的值加 1900。
void     setYear(int year)
// 返回GMT字符串
String     toGMTString()
// 返回本地字符串
String     toLocaleString()
// 返回字符串
String     toString()

Date示例

下面我們通過示例學習使用Date的API。
源碼如下(DateTest.java):

import java.util.Date;
import java.util.Calendar;
     
/**
 * java Date類的測試程序
 * 
 * 注意幾點:
 * (01) Date中的“年”      -- 讀取/設置 到的年份值=“‘時間年份’ - 1900年”
 * (02) Date中的“月”      -- 0是一月,1是二月,2是三月,依次類推。
 * (03) Date中的“星期幾”  -- 1是周日,2是周一,3是周二,依次類推。
 *
 * @author skywang
 */
public class DateTest {
         
    public static void main(String[] args) {
     
        // 測試Date的構造函數:Date共有5類構造函數
        testDateConstructor();
     
        // 測試Date類的“設置”、“讀取”函數
        testDateSet();
     
        // 測試Date類的before(), after(), compareTo(), equals(), clone(), parse()等接口
        testOtherDateAPIs();
    }
     
    /**
     * 測試Date的構造函數:Date共有5類構造函數
     */
    private static void testDateConstructor() {
     
        Date date;
     
        // Date構造函數一:傳入“年、月、日”。
        // 參數說明
        // (01) 年 -- 減 1900 的年份。若要設為1988,則“年”應該是88。
        // (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
        // (03) 日 -- 1-31 之間的某一天。
        // 設置時間為“1988-08-08”
        date = new Date(88,7,8);
        System.out.printf("Constructor-1  : %s\n", tostring(date));
     
        // Date構造函數二:傳入“年、月、日、時、分”
        // (01) 年 -- 減 1900 的年份。若要設為1988,則“年”應該是88。
        // (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
        // (03) 日 -- 1-31 之間的某一天。
        // (04) 時 -- 0-23 之間的小時數。
        // (05) 分 -- 0-59 之間的分鐘數。
        // 設置時間為“1999-09-09 19:19”
        date = new Date(99,8,9,19,19);
        System.out.printf("Constructor-2  : %s\n", tostring(date));
     
        // Date構造函數三:傳入“年、月、日、時、分、秒”
        // (01) 年 -- 減 1900 的年份。若要設為1988,則“年”應該是88。
        // (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
        // (03) 日 -- 1-31 之間的某一天。
        // (04) 時 -- 0-23 之間的小時數。
        // (05) 分 -- 0-59 之間的分鐘數。
        // (06) 秒 -- 0-59 之間的秒鐘數。
        date = new Date(100,10,10,20,10,10);
        System.out.printf("Constructor-3  : %s\n", tostring(date));
     
        // Date構造函數四:傳入“毫秒”。 毫秒 = “目標時間” - “1970-01-01 00:00:00 GMT”
        // 973858210000(ms) 對應時間 2000-10-10 8:10:10
        date = new Date(973858210000l);
        System.out.printf("Constructor-4  : %s\n", tostring(date));
     
        // Date構造函數五:傳入“字符串”。可以為以下幾種格式:
        // (注意,year值 = “實際年份-1900”)
        // 1955-08-12 13:30:00
        date = new Date("Sat, 12 Aug 95 13:30:00 GMT");
        System.out.printf("Constructor-5.1: %s\n", tostring(date));
        // 1955-08-12 13:30:00
        date = new Date("12 Aug 95 13:30:00");
        System.out.printf("Constructor-5.2: %s\n", tostring(date));
        // 1955-08-12
        date = new Date("12 Aug 95");
        System.out.printf("Constructor-5.3: %s\n", tostring(date));
    }
     
    /**
     * 測試Date類的“讀取”函數
     */
    private static void testGet(Date date) {
        // “年”。減 1900 的年份。若為1988,則“年”是88。
        int year = date.getYear();
        // “月”。 0-11 的月份。0是一月,1是二月,依次類推。
        int month = date.getMonth();
        // “日”
        int day = date.getDate();
        // “時”
        int hour = date.getHours();
        // “分”
        int minute = date.getMinutes();
        // “秒”
        int second = date.getSeconds();
        // “星期(幾)”。 周日是1,周一是2,周二是3,依次類推。
        int weekday = date.getDay();
        // “毫秒”。毫秒 = “目標時間” - “1970-01-01 00:00:00 GMT”
        long millis = date.getTime();
        // “時區偏移”。相對於 UTC 的本地時區的偏移量(以分鐘為單位)。
        int timezoneoffset = date.getTimezoneOffset();
     
        //System.out.printf("\t!!!date get is: %s\n", tostring(date));
        System.out.println("\t!!!get date: "+year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second+"\t"+millis+"(ms)");
    }
     
     
    /**
     * 測試Date類的“設置”函數
     */
    private static void testDateSet() {
        // 新建date
        Date date = new Date(99,8,9);
     
        // 設置Date為“2013-09-19 15:28:30”
        // 設為“2013年”。傳入值是“‘目標年份’ - ‘1900 的年份’”
        date.setYear(113);
        // 設為“8月”,傳入的參數應該是8。因為,一月是0,二月是1,依次類推。
        date.setMonth(8);
        // 設為“19日”
        date.setDate(19);
        // 設為“15”(上午)。采用的24時制;因此,若要設為上午3點,應該傳入參數3。
		// 查看本欄目
			
		
		

GMT、UTC、時區的關系

許多人都知道兩地時間表簡稱為GMT或UTC,而世界時區表則通稱為World Time,那麼GMT與UTC的實質原意又是為何?世界時區又是怎麼區分的?面盤上密密麻麻的英文單字代表著什麼意義與作用呢?這些都是新手在接觸兩地時間表或世界時區表時,腦海中所不斷浮現的種種疑問,以下將帶您一探時區奧妙的究竟。

世界時區及國際換日線示意圖

全球24個時區的劃分

相較於兩地時間表,可以顯示世界各時區時間和地名的世界時區表(World Time),就顯得精密與復雜多了,通常世界時區表的表盤上會標示著全球24個時區的城市名稱,但究竟這24個時區是如何產生的?過去世界各地原本各自訂定當地時間,但隨著交通和電訊的發達,各地交流日益頻繁,不同的地方時間,造成許多困擾,於是在西元1884年的國際會議上制定了全球性的標准時,明定以英國倫敦格林威治這個地方為零度經線的起點(亦稱為本初子午線),並以地球由西向東每24小時自轉一周360°,訂定每隔經度15°,時差1小時。而每15°的經線則稱為該時區的中央經線,將全球劃分為24個時區,其中包含23個整時區及180°經線左右兩側的2個半時區。就全球的時間來看,東經的時間比西經要早,也就是如果格林威治時間是中午12時,則中央經線15°E的時區為下午1時,中央經線30°E時區的時間為下午2時;反之,中央經線15°W的時區時間為上午11時,中央經線30°W時區的時間為上午10時。以台灣為例,台灣位於東經121°,換算後與格林威治就有8小時的時差。如果兩人同時從格林威治的0°各往東、西方前進,當他們在經線180°時,就會相差24小時,所以經線180°被定為國際換日線,由西向東通過此線時日期要減去一日,反之,若由東向西則要增加一日。

格林威治標准時間GM

十七世紀,格林威治皇家天文台為了海上霸權的擴張計畫而進行天體觀測。1675年舊皇家觀測所(Old Royal Observatory) 正式成立,到了1884年決定以通過格林威治的子午線作為劃分地球東西兩半球的經度零度。觀測所門口牆上有一個標志24小時的時鐘,顯示當下的時間,對全球而言,這裡所設定的時間是世界時間參考點,全球都以格林威治的時間作為標准來設定時間,這就是我們耳熟能詳的「格林威治標准時間」(Greenwich Mean Time,簡稱G.M.T.)的由來,標示在手表上,則代表此表具有兩地時間功能,也就是同時可以顯示原居地和另一個國度的時間。

世界協調時間UTC

多數的兩地時間表都以GMT來表示,但也有些兩地時間表上看不到GMT字樣,出現的反而是UTC這3個英文字母,究竟何謂UTC?事實上,UTC指的是Coordinated Universal Time- 世界協調時間(又稱世界標准時間、世界統一時間),是經過平均太陽時(以格林威治時間GMT為准)、地軸運動修正後的新時標以及以「秒」為單位的國際原子時所綜合精算而成的時間,計算過程相當嚴謹精密,因此若以「世界標准時間」的角度來說,UTC比GMT來得更加精准。其誤差值必須保持在0.9秒以內,若大於0.9秒則由位於巴黎的國際地球自轉事務中央局發布閏秒,使UTC與地球自轉周期一致。所以基本上UTC的本質強調的是比GMT更為精確的世界時間標准,不過對於現行表款來說,GMT與UTC的功能與精確度是沒有差別的。

夏日節約時間DS

所謂「夏日節約時間」Daylight Saving Time(簡稱D.S.T.),是指在夏天太陽升起的比較早時,將時鐘撥快一小時,以提早日光的使用,在英國則稱為夏令時間(Summer Time)。這個構想於1784年由美國班傑明·富蘭克林提出來,1915年德國成為第一個正式實施夏令日光節約時間的國家,以削減燈光照明和耗電開支。自此以後,全球以歐洲和北美為主的約70個國家都引用這個做法。目前被劃分成兩個時區的印度也正在商討是否全國該統一實行夏令日光節約時間。歐洲手機上也有很多GSM系統的基地台,除了會傳送當地時間外也包括夏令日光節約時間,做為手機的時間標准,使用者可以自行決定要開啟或關閉。值得注意的是,某些國家有實施「夏日節約時間」的制度,出國時別忘了跟隨當地習慣在表上調整一下,這可是機械表沒有的功能設計哦!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved