簡體   English   中英

JAVA獲取兩個日期之間的下班時間差

[英]JAVA get offtime difference between two dates

我有一些代碼來獲取兩個日期的兩個時區偏移量之間的差異。

int diff= date1.getTimezoneOffset() - date2.getTimezoneOffset();

但是我正在使用方法getTimezoneOffset() ,該方法已被棄用,我需要使用其他方法進行相同操作。 如何獲取兩個日期之間的時區偏移量?

PS .:我不知道這個日期的時區是多少。

混亂的混亂

這個問題出奇的棘手。

java.util.Date類最初設計為具有時區。 JVM的當前默認時區是使用no-arg構造函數隱式分配的。 我們可以通過getTimeZoneOffset命令提取該時區的偏移量 ,如本例所示。

java.util.Date date = new java.util.Date();
int offset = date.getTimezoneOffset (); 

在我的America/Los_Angeles時區為我帶來的結果:

420

除以60除以7,就比UTC晚7點,即美國西海岸的夏令時(DST) 請注意,此類如何使用正數而不是負數來表示更常見的UTC(例如ISO 8601)后面的偏移量。

因此,如果您真的想獲得兩個java.util.Date對象的偏移量之差,請減去getTimeZoneOffset返回的一對int值(以分鍾為單位),並以60除以小時。 提示:並非所有時區都是整個小時。 例如,印度比世界標准時間+05:30早五個半小時。

您可以看到此類的toString方法的實現所使用的時區。

System.out.println ( "now: " + new java.util.Date ().toString () );

2015年10月27日星期二18:49:45

順便說一下,請注意在該字符串中使用PDT 這樣的3-4個字母代碼既不是標准化的也不是唯一的,應避免使用。 此類的許多問題中的另一個。 而是使用正確的時區名稱,例如America/Los_AngelesAfrica/Casablanca

無法指定時區

奇怪的是,沒有可以在其中指定時區的構造函數。 也沒有用於設置時區的設置方法。 我正在考慮不推薦使用的方法和當前方法。 或者,您可能認為可以將偏移量作為輸入字符串的一部分傳遞給靜態Date.parse方法的任一構造函數 但是不,它們都返回一個很長的時間(自該紀元以來的秒數),而不是返回通過偏移量的juDate。 這就是為什么我們經常以簡寫形式說“ java.util.Date沒有時區”的原因,這在技術上並不正確,但在實際意義上是合適的。

.Calendar

Java 1.1 java.util.Calendar ,添加了java.util.Calendar類以接管對時區和其他事項的跟蹤。 因此,在java.util.Date類中為其內部保留了殘留的時區,雖然不是很明確,但也不是處於休眠狀態。

避免這些舊課程

所有這些都是一個混亂的大混亂。 明智的解決方法是完全避免使用舊的日期時間類:

…和他們的親戚。

java.time

現在,舊類已被Java 8及更高版本中內置的新java.time框架取代。 受到非常成功的Joda-Time庫的啟發,該庫由JSR 310定義,並由ThreeTen-Extra項目擴展。 請參閱教程

有一些學習曲線可以掌握此框架,但要花很多時間。 新類是邏輯的,統一的,並且非常有用。 便捷方法提供了在與尚未更新的代碼進行交互以處理新類型時與舊類型進行轉換的能力。

Instant課程是UTC時間軸上的時刻。 ZonedDateTime是一個Instant,它調整為表示為ZoneId的時區。

Instant instant = Instant.now();
ZoneId zoneId = ZoneId.of ( "America/Los_Angeles" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

轉儲到控制台。

System.out.println ( "instant: " + instant + "  |  zoneId: " + zoneId + "  |   zdt: " + zdt );

立即:2015-10-28T02:25:25.719Z | zoneId:America / Los_Angeles | zdt:2015-10-27T19:25:25.719-07:00 [America / Los_Angeles]

請記住,時區是相對於UTC的偏移量以及一組用於處理過去,現在和將來的異常的規則,例如夏時制。 ZoneId是一個時區,而ZoneOffset只是沒有其他所有規則的自UTC偏移量 一旦有了ZoneOffset ,我們就可以詢問偏移量(以秒為單位)。

ZoneOffset zoneOffset = zdt.getOffset ();
int offsetAsSeconds = zoneOffset.getTotalSeconds ();

轉儲到控制台。

System.out.println ( "zoneOffset: " + zoneOffset + " = offsetAsSeconds: " + offsetAsSeconds );

zoneOffset:-07:00 = offsetAsSeconds:-25200

您可以比較一對ZonedDateTime對象,以獲取它們各自的偏移量(以秒為單位),然后減去以得到它們的差值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM