Java時間工具類

Date
Date 表示距離1970-01-01 00:00:00的毫秒數,值與時區無關。toString時用本地時區輸出,如Thu Jun 30 17:12:57 CST 2016,CST表示China Standard Time。
 
public Date()
當前時間,例如,System.out.println(new Date());//Thu Jan 01 08:00:00 CST 1970 CST表示UTC+8,因此是8點
 
public Date(long date)
分配Date對象並初始化此對象,以表示自從標準基準時間(稱爲「曆元(epoch)」,即1970 年 1 月 1 日 00:00:00 GMT)以來的指定毫秒數。
 
大部分Date的方法都過期了,由Calendar類的方法替代,如下是幾個重要的方法:
public boolean after(Date when)
測試此日期是否在指定日期以後。
 
public boolean before(Date when)
測試此日期是否在指定日期以前。
 
public int compareTo(Date anotherDate)
比較兩個日期的順序。
若是參數Date等於此Date,則返回值0;若是此Date在Date參數以前,則返回小於0的值;若是此Date在Date參數以後,則返回大於0的值。
 
public boolean equals(Object obj)
比較兩個日期的相等性。當且僅當參數不爲null,而且是一個表示與此對象相同的時間點(到毫秒)的Date對象時,結果才爲true。
所以,當且僅當getTime方法對於兩個Date對象返回相同的long值時,這兩個對象纔是相等的。
 
public long getTime()
返回自1970 年 1 月 1 日 00:00:00 GMT以來此Date對象表示的毫秒數。
 
public void setTime(long time)
設置此Date對象,以表示1970 年 1 月 1 日 00:00:00 GMT之後time毫秒的時間點。
 
TimeZone
TimeZone表示時區偏移量,也能夠計算夏令時。 一般,使用getDefault獲取TimeZone,getDefault基於程序運行所在的時區建立TimeZone。例如,對於在日本運行的程序,getDefault基於日本標準時間建立TimeZone對象。 也能夠用getTimeZone及時區ID獲取TimeZone。例如美國太平洋時區的時區ID是"America/Los_Angeles"。所以,可使用下面語句得到美國太平洋時間TimeZone對象:TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
可使用getAvailableIDs方法來對全部受支持的時區ID進行迭代。能夠選擇受支持的ID來得到TimeZone。若是想要的時區沒法用受支持的ID之一表示,那麼能夠指定自定義時區ID來生成TimeZone。自定義時區ID的語法是:
NormalizedCustomID:
GMT Sign TwoDigitHours : Minutes
Sign:下面之一
+ -
TwoDigitHours:
Digit Digit
Minutes:
Digit Digit
Digit:下面之一
0 1 2 3 4 5 6 7 8 9
例如,TimeZone.getTimeZone("GMT-8").getID()返回"GMT-08:00"。 Hours必須在0至23之間,Minutes必須在00至59之間。"GMT+10"和"GMT+0010"分別意味着比GMT提早10小時和10分鐘。
爲了與JDK1.1.x兼容,一些三字母時區ID(好比"PST"、"CTT"、"AST")也受支持。可是,它們的使用被廢棄,這是由於相同的縮寫常常用於多個時區(例如"CST"能夠是美國的"Central Standard Time"和"China Standard Time"),可是 Java平臺只能夠識別其中一種。
例如:
public static void main(String[] args) {
TimeZone timeZone = TimeZone.getDefault();
System.out.println(timeZone.getDisplayName(true, TimeZone.LONG));//中國夏令時
System.out.println(timeZone.getDisplayName(false, TimeZone.LONG));//中國標準時間
System.out.println(timeZone.getDisplayName(true, TimeZone.SHORT));//CDT
System.out.println(timeZone.getDisplayName(false, TimeZone.SHORT));//CST
System.out.println(timeZone.getID());//Asia/Shanghai
 
TimeZone timeZone1 = TimeZone.getTimeZone("AST");
System.out.println(timeZone1.getDisplayName(true, TimeZone.LONG));//阿拉斯加夏令時
System.out.println(timeZone1.getDisplayName(false, TimeZone.LONG));//阿拉斯加標準時間
System.out.println(timeZone1.getDisplayName(true, TimeZone.SHORT));//AKDT
System.out.println(timeZone1.getDisplayName(false, TimeZone.SHORT));//AKST
System.out.println(timeZone1.getID());//AST
 
TimeZone timeZone2 = TimeZone.getTimeZone("America/Los_Angeles");
System.out.println(timeZone2.getDisplayName(true, TimeZone.LONG));//太平洋夏令時
System.out.println(timeZone2.getDisplayName(false, TimeZone.LONG));//太平洋標準時間
System.out.println(timeZone2.getDisplayName(true, TimeZone.SHORT));//PDT
System.out.println(timeZone2.getDisplayName(false, TimeZone.SHORT));//PST
System.out.println(timeZone2.getID());//America/Los_Angeles
 
TimeZone timeZone3 = TimeZone.getTimeZone("GMT+00:10");
System.out.println(timeZone3.getDisplayName(true, TimeZone.LONG));//GMT+00:10
System.out.println(timeZone3.getDisplayName(false, TimeZone.LONG));//GMT+00:10
System.out.println(timeZone3.getDisplayName(true, TimeZone.SHORT));//GMT+00:10
System.out.println(timeZone3.getDisplayName(false, TimeZone.SHORT));//GMT+00:10
System.out.println(timeZone3.getID());//GMT+00:10
}
 
Calendar
Calendar類是一個抽象類,它爲特定瞬間與一組諸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日曆字段之間的轉換提供了一些方法,併爲操做日曆字段(例如得到下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間1970 年 1 月 1 日的00:00:00.000,格里高利曆)的偏移量。因爲Calendar是抽象類,它有多個子類,例如GregorianCalendar(格里高利曆或稱公曆)、JapaneseImperialCalendar(JDK7.0增長)。與其餘語言環境敏感類同樣,Calendar 提供了一個類方法getInstance,以得到此類型的一個通用的對象。Calendar的getInstance方法返回一個Calendar子類的對象,其日曆字段已由當前日期和時間初始化:
public static Calendar getInstance()
返回的 Calendar 基於當前時間,使用了默認時區和默認語言環境。
 
public static Calendar getInstance(Locale aLocale)
返回的 Calendar 基於當前時間,使用了默認時區和給定的語言環境。
 
public static Calendar getInstance(TimeZone zone)
返回的 Calendar 基於當前時間,使用了給定時區和默認語言環境。
 
public static Calendar getInstance(TimeZone zone,Locale aLocale)
返回的 Calendar 基於當前時間,使用了給定的時區和給定的語言環境。
 
Calendar使用兩個參數定義了特定於語言環境的7天制星期,能夠在sun.util.resources包中的CalendarData_<locale>.class (on Oracle JVM)查看:
星期的第一天(firstDayOfWeek):例如,在美國,這一天是SUNDAY,而在法國,這一天是MONDAY,在Calendar類中,中國默認也是SUNDAY。
一年或一個月中第一個星期所需的最少天數(minimalDaysInFirstWeek):範圍是1-7。這些數字取自構造Calendar時的Locale。還能夠經過爲其設置值的方法來顯式地指定它們。
 
能夠經過調用set方法來設置日曆字段值。在須要計算時間值(距曆元所通過的毫秒)或日曆字段值以前,不會解釋Calendar中的全部字段值設置。調用get、getTimeInMillis、getTime、add 和roll涉及此類計算。
Calendar有兩種解釋日曆字段的模式,即lenient和non-lenient。當Calendar處於 lenient 模式時,它可接受比它所生成的日曆字段範圍更大範圍內的值。當Calendar從新計算日曆字段值,以便由get()返回這些值時,全部日曆字段都被標準化。例如,lenient模式下的GregorianCalendar將MONTH == JANUARY、DAY_OF_MONTH == 32解釋爲February 1。 當Calendar處於non-lenient模式時,若是其日曆字段中存在任何不一致性,它都會拋出一個異常。例如,GregorianCalendar老是在1與月份的長度之間生成DAY_OF_MONTH值。若是已經設置了任何超出範圍的字段值,那麼在計算時間或日曆字段值時,處於non-lenient模式下的GregorianCalendar會拋出一個異常。public void setLenient(boolean lenient)能夠設置寬鬆性。
 
GregorianCalendar
GregorianCalendar是Calendar最重要的一個子類,提供了世界上大多數國家/地區使用的標準日曆系統。 GregorianCalendar是一種混合日曆,同時支持儒略曆和格里高利曆系統。setGregorianChange(Date date)設置GregorianCalendar的更改日期。這是發生從儒略曆日期切換到格里高利曆日期的點。默認時間是1582 年 10 月 15 日(格里高利曆)。在此以前,日期是按照儒略曆計算的。 要獲得純粹的儒略曆日曆,可將更改setGregorianChange日期設置爲Date(Long.MAX_VALUE)。要獲得一個純粹的格里高利曆日曆,可將更改setGregorianChange日期設置爲Date(Long.MIN_VALUE)。 歷史上,在那些首先採用格里高利曆的國家/地區中,1582 年 10 月 4 日(儒略曆)以後就是 1582 年 10 月 15 日(格里高利曆)。此日曆正確地模擬了這些變化。在開始格里高利曆以前,GregorianCalendar實現的是儒略曆。格里高利曆和儒略曆之間的惟一區別就是閏年規則。儒略曆指定每 4 年就爲閏年,而格里高利曆則忽略不能被400整除的世紀年。
WEEK_OF_YEAR 字段值的範圍從1 到 53。一年的第一個星期始於getFirstDayOfWeek()的最先7天,至少包含該年的getMinimalDaysInFirstWeek()天。這取決於getMinimalDaysInFirstWeek()、getFirstDayOfWeek()的值以及1 月 1 日是星期幾。一年的第一個星期和下一年的第一個星期之間的各個星期按順序從2到52或53(根據須要)進行編號。 例如,1998 年 1 月 1 日是星期四。若是getFirstDayOfWeek()爲MONDAY,而且getMinimalDaysInFirstWeek()爲4(這些值反映了ISO 8601和不少國家/地區標準),則1998 年的第一個星期開始於1997 年 12 月 29 日,結束於1998 年 1 月 4 日。可是,若是getFirstDayOfWeek()爲SUNDAY,那麼1998年的第一個星期開始於1998 年 1 月 4 日,結束於1998 年 1 月 10 日;1998年頭三天是1997 年第53個星期的一部分。
WEEK_OF_MONTH 字段值的範圍從0到6。一個月的第一個星期(WEEK_OF_MONTH = 1 的日期)是該月至少連續 getMinimalDaysInFirstWeek() 天中的最先日期,結束於 getFirstDayOfWeek() 的前一天。與一年的第一個星期不一樣,一個月的第一個星期可能短於7天,也沒必要從getFirstDayOfWeek()這一天開始,而且不包括前一個月的日期。在第一個星期以前該月日期的WEEK_OF_MONTH爲0。 例如,若是getFirstDayOfWeek() 爲SUNDAY,getMinimalDaysInFirstWeek()爲4,那麼1998 年 1 月的第一個星期是從1 月 4 日星期日到1 月 10 日星期六。這些天的 WEEK_OF_MONTH 爲1。1 月 1 日星期四到1 月 3 日星期六的WEEK_OF_MONTH爲0。若是getMinimalDaysInFirstWeek() 變爲3,則1 月 1 日到1 月 3 日的 WEEK_OF_MONTH 爲 1。
 
set(f, value)
將日曆字段f更改成value。此外,它設置了一個內部成員變量,以指示日曆字段f已經被更改。儘管日曆字段f是當即更改的,可是直到下次調用get()、getTime()、getTimeInMillis()、add() 或 roll()時纔會從新計算日曆的時間值(以毫秒爲單位)。所以,屢次調用set()不會觸發屢次沒必要要的計算。使用set()更改日曆字段的結果是,其餘日曆字段也可能發生更改,這取決於日曆字段、日曆字段值和日曆系統。
示例:假定GregorianCalendar最初被設置爲1999 年 8 月 31 日。調用set(Calendar.MONTH, Calendar.SEPTEMBER)將該日期設置爲 1999 年 9 月 31 日。這是1999 年 10 月 1 日的一個暫時內部表示。此時月份按道理應該是10月,可是,在調用getTime()以前調用set(Calendar.DAY_OF_MONTH, 30) 會將該日期設置爲1999 年 9 月 30 日,由於在調用set()以後沒有發生從新計算。
 
add(f, delta)
將delta添加到f字段中。這等同於調用set(f, get(f) + delta)。與set()不一樣,add()強迫日曆系統當即從新計算日曆的毫秒數和全部字段。add()有兩個規則:
一、調用後f字段的值減去調用前f字段的值等於delta,字段f字段值超出其範圍時,下一個更大的字段會遞增或遞減,並將字段值調整回其範圍內。
二、若是指望某一個更小的字段是不變的,可是讓它等於之前的值是不可能的,由於在當前字段發生更改以後,或者在出現其餘約束以後,好比時區偏移量發生更改,更小字段的最大值和最小值也在發生更改,而後它的值被調整爲儘可能接近於所指望的值。更小的字段表示一個更小的時間單元,例如HOUR是一個比DAY_OF_MONTH更小的字段。對於不指望是不變字段的更小字段,無需進行任何調整。日曆系統例如格里高利曆等會自行肯定指望不變的有哪些字段。
示例:假定GregorianCalendar最初被設置爲1999 年 8 月 31 日。調用add(Calendar.MONTH, 13) 將日曆設置爲2000 年 9 月 30 日。Add 規則1 MONTH字段設置爲September,由於向August添加13個月得出的就是下一年的September。由於在GregorianCalendar 中,DAY_OF_MONTH不多是9 月 31 日,因此add 規則2將DAY_OF_MONTH設置爲30,即最可能的值。儘管DAY_OF_WEEK是一個更小的字段,但不能根據規則2調整DAY_OF_WEEK,由於在GregorianCalendar中的月份發生變化時,該值也須要發生變化。這個例子能夠理解爲,月份日後增長13個月後的月份最後一天。
 
roll(f, delta)
將delta添加到f字段中,這等同於調用add(f, delta),但不更改更大的字段。更大的字段表示一個更大的時間單元。DAY_OF_MONTH 是一個比HOUR大的字段。
 
add和roll的區別
原來設置爲1999 年 8 月 31 日的GregorianCalendar 。如今調用roll(Calendar.MONTH, 8) 將該日曆設置爲1999 年 4 月 30 日。若是使用GregorianCalendar,則4月份的DAY_OF_MONTH字段不可能爲 31。將DAY_OF_MONTH設置爲最可能接近的值30。YEAR字段保持爲值1999,由於它是一個比MONTH 更大的字段,因此不能改變。
原來設置爲1999 年 6 月 6日星期日的GregorianCalendar 。如今調用roll(Calendar.WEEK_OF_MONTH, -1) 將該日曆設置爲1999 年 6 月 1 日星期二,而調用add(Calendar.WEEK_OF_MONTH, -1) 則將日曆設置爲1999 年 5 月 30 日星期日。這是由於上升和降低規則施加了其餘的約束:WEEK_OF_MONTH改變時MONTH必須不變。所得日期一定在6 月 1日星期二和6 月 5 日星期六之間。DAY_OF_WEEK(在改變WEEK_OF_MONTH時它是一個不變量)被設置爲Tuesday,是最接近Sunday的可能值(其中星期日是一個星期的第一天)。
 
public GregorianCalendar()
在具備默認語言環境的默認時區內使用當前時間構造一個默認的GregorianCalendar。
 
public GregorianCalendar(TimeZone zone)
在具備默認語言環境的給定時區內構造一個基於當前時間的GregorianCalendar。
 
public GregorianCalendar(Locale aLocale)
在具備給定語言環境的默認時區內構造一個基於當前時間的GregorianCalendar。
 
public GregorianCalendar(TimeZone zone,Locale aLocale)
在具備給定語言環境的給定時區內構造一個基於當前時間的GregorianCalendar。
 
public GregorianCalendar(int year,int month, int dayOfMonth)
在具備默認語言環境的默認時區內構造一個帶有給定日期設置的GregorianCalendar。
 
public GregorianCalendar(int year,int month,int dayOfMonth,int hourOfDay, int minute)
爲具備默認語言環境的默認時區構造一個具備給定日期和時間設置的GregorianCalendar。
 
public GregorianCalendar(int year, int month,int dayOfMonth,int hourOfDay,int minute,int second)
爲具備默認語言環境的默認時區構造一個具備給定日期和時間設置的GregorianCalendar。
 
例如:
private static String getDayOfWeek(int i) {
switch (i) {
case Calendar.SUNDAY:
return "星期日";
case Calendar.MONDAY:
return "星期一";
case Calendar.TUESDAY:
return "星期二";
case Calendar.WEDNESDAY:
return "星期三";
case Calendar.THURSDAY:
return "星期四";
case Calendar.FRIDAY:
return "星期五";
case Calendar.SATURDAY:
return "星期六";
default:
return "";
}
}
 
public static void main(String[] args) {
//當前時間,設置GregorianCalendar的環境爲中國所在時區和中國的語言環境
GregorianCalendar gregorianCalendar = new GregorianCalendar(TimeZone.getTimeZone("Asia/Shanghai"), Locale.CHINA);
 
//獲取每週第一天和每一年第一週的最少天數
System.out.println("第一週的最少天數:" + gregorianCalendar.getMinimalDaysInFirstWeek());
System.out.println("每週第一天是:" + getDayOfWeek(gregorianCalendar.getFirstDayOfWeek()));
 
//即便設置了中國語言環境,這裏獲取到的每週第一天仍是星期日,所以須要手動設置
gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println("每週第一天是:" + getDayOfWeek(gregorianCalendar.getFirstDayOfWeek()));
 
//打印各個字段
System.out.println("公元前或者公元后:" + (gregorianCalendar.get(Calendar.ERA) == GregorianCalendar.BC ? "公元前" :
(gregorianCalendar.get(Calendar.ERA) == GregorianCalendar.AD ? "公元" : "")));
System.out.println("年:" + gregorianCalendar.get(Calendar.YEAR));
 
//月份從0-11
System.out.println("月:" + (gregorianCalendar.get(Calendar.MONTH) + 1));
 
System.out.println("當前年中第幾周:" + gregorianCalendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("當前年中第幾天:" + gregorianCalendar.get(Calendar.DAY_OF_YEAR));
System.out.println("當前月中第幾周:" + gregorianCalendar.get(Calendar.WEEK_OF_MONTH));
 
//1到7老是對應於DAY_OF_WEEK_IN_MONTH 1;8 到 14老是對應於DAY_OF_WEEK_IN_MONTH 2,依此類推
//負數是從末尾開始計算,固定一週爲7天
System.out.println("當前月中第幾周(固定):" + gregorianCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
 
System.out.println("當前月中第幾天:" + gregorianCalendar.get(Calendar.DATE));
System.out.println("當前月中第幾天:" + gregorianCalendar.get(Calendar.DAY_OF_MONTH));
System.out.println("星期:" + getDayOfWeek(gregorianCalendar.get(Calendar.DAY_OF_WEEK)));
System.out.println("上午或者下午:" + (gregorianCalendar.get(Calendar.AM_PM) == GregorianCalendar.AM ? "上午" :
(gregorianCalendar.get(Calendar.AM_PM) == GregorianCalendar.PM ? "下午" : "")));
 
//上午或下午的小時。HOUR用於12小時制時鐘 (0 - 11)。中午和午夜用0表示,不用12表示。
System.out.println("小時:" + gregorianCalendar.get(Calendar.HOUR));
 
//一天中的小時。HOUR_OF_DAY用於24小時制時鐘。
System.out.println("小時:" + gregorianCalendar.get(Calendar.HOUR_OF_DAY));
 
System.out.println("分鐘:" + gregorianCalendar.get(Calendar.MINUTE));
System.out.println("秒鐘:" + gregorianCalendar.get(Calendar.SECOND));
System.out.println("毫秒:" + gregorianCalendar.get(Calendar.MILLISECOND));
 
//以毫秒爲單位指示距GMT的大體偏移量
System.out.println("時區偏移量:" + gregorianCalendar.get(Calendar.ZONE_OFFSET));
 
//以毫秒爲單位指示夏令時的偏移量。
System.out.println("夏令時偏移量:" + gregorianCalendar.get(Calendar.DST_OFFSET));
}
 
輸出:
第一週的最少天數:1
每週第一天是:星期日
每週第一天是:星期一
公元前或者公元后:公元
年:2018
月:9
當前年中第幾周:38
當前年中第幾天:261
當前月中第幾周:4
當前月中第幾周(固定):3
當前月中第幾天:18
當前月中第幾天:18
星期:星期二
上午或者下午:下午
小時:2
小時:14
分鐘:34
秒鐘:54
毫秒:473
時區偏移量:28800000
夏令時偏移量:0
 
夏令時
public static void main(String[] args) throws Exception {
//澳大利亞悉尼時區是UTC+10
//夏令時開始於當地時間每一年10月份第一個星期日的2點 2018-10-07 02:00
//結束於當地時間每一年4月份第一個星期日的3點 2019-04-07 03:00
//UTC時間2018-10-06 16:00:00開始夏令時
//UTC時間2019-04-06 16:00:00結束夏令時
TimeZone sydney = TimeZone.getTimeZone("Australia/Sydney");
TimeZone beijing = TimeZone.getTimeZone("Asia/Shanghai");
TimeZone UTC = TimeZone.getTimeZone("UTC");
 
SimpleDateFormat sydneyFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sydneyFormat.setTimeZone(sydney);
SimpleDateFormat beijingFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
beijingFormat.setTimeZone(beijing);
 
GregorianCalendar gregorianCalendar1 = new GregorianCalendar(UTC);
gregorianCalendar1.set(Calendar.YEAR, 2018);
gregorianCalendar1.set(Calendar.MONTH, Calendar.OCTOBER);
gregorianCalendar1.set(Calendar.DAY_OF_MONTH, 6);
gregorianCalendar1.set(Calendar.HOUR_OF_DAY, 15);
gregorianCalendar1.set(Calendar.MINUTE, 59);
gregorianCalendar1.set(Calendar.SECOND, 59);
gregorianCalendar1.set(Calendar.MILLISECOND, 999);
 
 
GregorianCalendar gregorianCalendar2 = new GregorianCalendar(UTC);
gregorianCalendar2.set(Calendar.YEAR, 2018);
gregorianCalendar2.set(Calendar.MONTH, Calendar.OCTOBER);
gregorianCalendar2.set(Calendar.DAY_OF_MONTH, 6);
gregorianCalendar2.set(Calendar.HOUR_OF_DAY, 16);
gregorianCalendar2.set(Calendar.MINUTE, 0);
gregorianCalendar2.set(Calendar.SECOND, 0);
gregorianCalendar2.set(Calendar.MILLISECOND, 0);
 
 
System.out.println("===========================================================");
System.out.println("悉尼:" + sydneyFormat.format(gregorianCalendar1.getTime())
+ " 對應北京時間:" + beijingFormat.format(gregorianCalendar1.getTime()));
System.out.println("夏令時開始");
System.out.println("悉尼:" + sydneyFormat.format(gregorianCalendar2.getTime())
+ " 對應北京時間:" + beijingFormat.format(gregorianCalendar2.getTime()));
System.out.println("===========================================================");
 
GregorianCalendar gregorianCalendar3 = new GregorianCalendar(UTC);
gregorianCalendar3.set(Calendar.YEAR, 2019);
gregorianCalendar3.set(Calendar.MONTH, Calendar.APRIL);
gregorianCalendar3.set(Calendar.DAY_OF_MONTH, 6);
gregorianCalendar3.set(Calendar.HOUR_OF_DAY, 15);
gregorianCalendar3.set(Calendar.MINUTE, 59);
gregorianCalendar3.set(Calendar.SECOND, 59);
gregorianCalendar3.set(Calendar.MILLISECOND, 999);
 
 
GregorianCalendar gregorianCalendar4 = new GregorianCalendar(UTC);
gregorianCalendar4.set(Calendar.YEAR, 2019);
gregorianCalendar4.set(Calendar.MONTH, Calendar.APRIL);
gregorianCalendar4.set(Calendar.DAY_OF_MONTH, 6);
gregorianCalendar4.set(Calendar.HOUR_OF_DAY, 16);
gregorianCalendar4.set(Calendar.MINUTE, 0);
gregorianCalendar4.set(Calendar.SECOND, 0);
gregorianCalendar4.set(Calendar.MILLISECOND, 0);
 
 
System.out.println("悉尼:" + sydneyFormat.format(gregorianCalendar3.getTime())
+ " 對應北京時間:" + beijingFormat.format(gregorianCalendar3.getTime()));
System.out.println("夏令時結束");
System.out.println("悉尼:" + sydneyFormat.format(gregorianCalendar4.getTime())
+ " 對應北京時間:" + beijingFormat.format(gregorianCalendar4.getTime()));
System.out.println("===========================================================");
}
 
輸出:
===========================================================
悉尼:2018-10-07 01:59:59 對應北京時間:2018-10-06 23:59:59
夏令時開始
悉尼:2018-10-07 03:00:00 對應北京時間:2018-10-07 00:00:00
===========================================================
悉尼:2019-04-07 02:59:59 對應北京時間:2019-04-06 23:59:59
夏令時結束
悉尼:2019-04-07 02:00:00 對應北京時間:2019-04-07 00:00:00
===========================================================
相關文章
相關標籤/搜索