本章主要介紹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 }
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