Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(3) Date

 

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

 


Date 介紹java

Date 定義ide

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轉換爲Calendarspa

// 新建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 函數列表code

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

// 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):

  1 import java.util.Date;
  2 import java.util.Calendar;
  3 
  4 /**
  5  * java Date類的測試程序
  6  * 
  7  * 注意幾點:
  8  * (01) Date中的「年」      -- 讀取/設置 到的年份值=「‘時間年份’ - 1900年」
  9  * (02) Date中的「月」      -- 0是一月,1是二月,2是三月,依次類推。
 10  * (03) Date中的「星期幾」  -- 1是週日,2是週一,3是週二,依次類推。
 11  *
 12  * @author skywang
 13  */
 14 public class DateTest {
 15     
 16     public static void main(String[] args) {
 17 
 18         // 測試Date的構造函數:Date共有5類構造函數
 19         testDateConstructor();
 20 
 21         // 測試Date類的「設置」、「讀取」函數
 22         testDateSet();
 23 
 24         // 測試Date類的before(), after(), compareTo(), equals(), clone(), parse()等接口
 25         testOtherDateAPIs();
 26     }
 27 
 28     /**
 29      * 測試Date的構造函數:Date共有5類構造函數
 30      */
 31     private static void testDateConstructor() {
 32 
 33         Date date;
 34 
 35         // Date構造函數一:傳入「年、月、日」。
 36         // 參數說明
 37         // (01) 年 -- 減 1900 的年份。若要設爲1988,則「年」應該是88。
 38         // (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
 39         // (03) 日 -- 1-31 之間的某一天。
 40         // 設置時間爲「1988-08-08」
 41         date = new Date(88,7,8);
 42         System.out.printf("Constructor-1  : %s\n", tostring(date));
 43 
 44         // Date構造函數二:傳入「年、月、日、時、分」
 45         // (01) 年 -- 減 1900 的年份。若要設爲1988,則「年」應該是88。
 46         // (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
 47         // (03) 日 -- 1-31 之間的某一天。
 48         // (04) 時 -- 0-23 之間的小時數。
 49         // (05) 分 -- 0-59 之間的分鐘數。
 50         // 設置時間爲「1999-09-09 19:19」
 51         date = new Date(99,8,9,19,19);
 52         System.out.printf("Constructor-2  : %s\n", tostring(date));
 53 
 54         // Date構造函數三:傳入「年、月、日、時、分、秒」
 55         // (01) 年 -- 減 1900 的年份。若要設爲1988,則「年」應該是88。
 56         // (02) 月 -- 0-11 的月份。0是一月,1是二月,依次類推。
 57         // (03) 日 -- 1-31 之間的某一天。
 58         // (04) 時 -- 0-23 之間的小時數。
 59         // (05) 分 -- 0-59 之間的分鐘數。
 60         // (06) 秒 -- 0-59 之間的秒鐘數。
 61         date = new Date(100,10,10,20,10,10);
 62         System.out.printf("Constructor-3  : %s\n", tostring(date));
 63 
 64         // Date構造函數四:傳入「毫秒」。 毫秒 = 「目標時間」 - 「1970-01-01 00:00:00 GMT」
 65         // 973858210000(ms) 對應時間 2000-10-10 8:10:10
 66         date = new Date(973858210000l);
 67         System.out.printf("Constructor-4  : %s\n", tostring(date));
 68 
 69         // Date構造函數五:傳入「字符串」。能夠爲如下幾種格式:
 70         // (注意,year值 = 「實際年份-1900」)
 71         // 1955-08-12 13:30:00
 72         date = new Date("Sat, 12 Aug 95 13:30:00 GMT");
 73         System.out.printf("Constructor-5.1: %s\n", tostring(date));
 74         // 1955-08-12 13:30:00
 75         date = new Date("12 Aug 95 13:30:00");
 76         System.out.printf("Constructor-5.2: %s\n", tostring(date));
 77         // 1955-08-12
 78         date = new Date("12 Aug 95");
 79         System.out.printf("Constructor-5.3: %s\n", tostring(date));
 80     }
 81 
 82     /**
 83      * 測試Date類的「讀取」函數
 84      */
 85     private static void testGet(Date date) {
 86         // 「年」。減 1900 的年份。若爲1988,則「年」是88。
 87         int year = date.getYear();
 88         // 「月」。 0-11 的月份。0是一月,1是二月,依次類推。
 89         int month = date.getMonth();
 90         // 「日」
 91         int day = date.getDate();
 92         // 「時」
 93         int hour = date.getHours();
 94         // 「分」
 95         int minute = date.getMinutes();
 96         // 「秒」
 97         int second = date.getSeconds();
 98         // 「星期(幾)」。 週日是1,週一是2,週二是3,依次類推。
 99         int weekday = date.getDay();
100         // 「毫秒」。毫秒 = 「目標時間」 - 「1970-01-01 00:00:00 GMT」
101         long millis = date.getTime();
102         // 「時區偏移」。相對於 UTC 的本地時區的偏移量(以分鐘爲單位)。
103         int timezoneoffset = date.getTimezoneOffset();
104 
105         //System.out.printf("\t!!!date get is: %s\n", tostring(date));
106         System.out.println("\t!!!get date: "+year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second+"\t"+millis+"(ms)");
107     }
108 
109 
110     /**
111      * 測試Date類的「設置」函數
112      */
113     private static void testDateSet() {
114         // 新建date
115         Date date = new Date(99,8,9);
116 
117         // 設置Date爲「2013-09-19 15:28:30」
118         // 設爲「2013年」。傳入值是「‘目標年份’ - ‘1900 的年份’」
119         date.setYear(113);
120         // 設爲「8月」,傳入的參數應該是8。由於,一月是0,二月是1,依次類推。
121         date.setMonth(8);
122         // 設爲「19日」
123         date.setDate(19);
124         // 設爲「15」(上午)。採用的24時制;所以,若要設爲上午3點,應該傳入參數3。
125         date.setHours(11);
126         // 設爲「28分」
127         date.setMinutes(28);
128         // 設爲「30秒」
129         date.setSeconds(30);
130         System.out.printf("new date-01 is: %s\n", tostring(date));
131 
132         // 測試Date的獲取函數
133         testGet(date);
134 
135         // 設爲「毫秒」,1379561310000(ms) 對應的時間是「2013-09-19 15:28:30」
136         date.setTime(1379561310000l);
137         System.out.printf("new date-02 is: %s\n", tostring(date));
138     }
139 
140     /**
141      * 測試Date類的before(), after(), compareTo(), equals(), clone(), parse()等接口
142      */
143     private static void testOtherDateAPIs() {
144         // 初始化d1=2008-05-12, d2=2009-03-15。
145         Date d1 = new Date(108,4,12);
146         System.out.printf("\nd1 is: %s\n", tostring(d1));
147         Date d2 = new Date(109,2,15);
148         System.out.printf("d2 is: %s\n", tostring(d2));
149 
150         // 克隆
151         Date d3 = (Date) d1.clone();
152         System.out.printf("clone of d1 is: %s\n", tostring(d3));
153 
154         // d1 是否早於 d2
155         boolean isBefore = d1.before(d2);
156         // d1 是否晚於 d2
157         boolean isAfter = d1.after(d2);
158         // d1 是否等於 d2
159         boolean isEquals = d1.after(d2);
160         // d1 和 d2 比較。
161         // 若d1 早於 d2,返回 -1
162         // 若d1 晚於 d2,返回 1
163         // 若d1 等於 d2,返回 0
164         int comp = d1.compareTo(d2);
165         System.out.printf("isBefore=%s, isAfter=%s, isEquals=%s, comp=%s\n", 
166                 isBefore, isAfter, isEquals, comp);
167 
168         // parse接口
169         long millis = Date.parse("13 Mar 2009");
170         // (注意,經過這種方式設置Date,獲取的Year值是「實際年份-1900」)
171         Date d4 = new Date(millis);
172         System.out.printf("millis=%s, d4=%s\n", millis, tostring(d4));
173         System.out.printf("d1.toGMTString()%s\n", d1.toGMTString());
174         System.out.printf("d1.toLocaleString()%s\n", d1.toLocaleString());
175         System.out.printf("d1.toString()%s\n", d1.toString());
176     }
177 
178     /**
179      * 將date轉換Calendar對象,並返回實際的年月日。
180      */
181     private static String tostring(Date date) {
182         // 獲取Date對應的Calendar
183         Calendar cal = Calendar.getInstance();
184         cal.setTime(date);
185         int year = cal.get(Calendar.YEAR);
186         int month = cal.get(Calendar.MONTH)+1;
187         int day = cal.get(Calendar.DATE);
188         int hour = cal.get(Calendar.HOUR);
189         int minute = cal.get(Calendar.MINUTE);
190         int second = cal.get(Calendar.SECOND);
191         long millis = cal.getTimeInMillis();
192 
193         return year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second+"\t"+millis+"(ms)";
194     }
195 }
View Code

 

 


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°被定爲國際換日線,由西向東經過此線時日期要減去一日,反之,若由東向西則要增長一日。

 

格林威治標準時間GMT
      十七世紀,格林威治皇家天文臺爲了海上霸權的擴張計畫而進行天體觀測。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的功能與精確度是沒有差異的。

 

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

 

 


更多內容

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(1) Calendar

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(2) 本身封裝的Calendar接口

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(3) Date

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(4) DateFormat

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(5) SimpleDateFormat

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(6) Locale

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(7) TimeZone

相關文章
相關標籤/搜索