2011-02-13 134 views
4

我試圖使用喬達時間,以便及時瞭解,其中每個點在其自己的本地時區的兩個點之間的持續時間的持續時間。計算與喬達時間

E.g. :

DateTime ny = new DateTime(2011, 2, 2, 7, 0, 0, 0, DateTimeZone.forID("America/New_York")); 
DateTime la = new DateTime(2011, 2, 3, 10, 15, 0, 0, DateTimeZone.forID("America/Los_Angeles")); 
DateTime utc1 = ny.withZone(DateTimeZone.UTC); 
DateTime utc2 = la.withZone(DateTimeZone.UTC);   
Period period = new Period(utc1, utc2); 

現在,我想知道,如果這是考慮到節約日光和閏年... 而且,使用「期間」正確的喬達 - 時間的方式來實現這一目標? 感謝;)

回答

10

會向您提供工作,並考慮到時區,但你不需要做轉換到UTC的代碼。此代碼更簡單,做同樣的事情(使用期限,而不是一個週期):

DateTime ny = new DateTime(2011, 2, 2, 7, 0, 0, 0, DateTimeZone.forID("America/New_York")); 
DateTime la = new DateTime(2011, 2, 3, 10, 15, 0, 0, DateTimeZone.forID("America/Los_Angeles")); 
Duration duration = new Interval(ny, la).toDuration(); 
4

取決於你如何使用它,上面的代碼可能不是一個好主意。

對於年/月/日/小時等採用int的所有DateTime構造函數都容易受到夏令時(DST)過渡期的影響,在這種情況下,Joda時間會拋出異常。所以,如果在過渡期間的時間是在應用程序中可能的輸入,它將會失敗:

DateTime ny = new DateTime(2011, 3, 13, 2, 0, 0, 0, DateTimeZone.forID("America/New_York")); 

Exception in thread "main" java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 2011-03-13T07:00:00.000 
at org.joda.time.chrono.ZonedChronology.localToUTC(ZonedChronology.java:143) 
at org.joda.time.chrono.ZonedChronology.getDateTimeMillis(ZonedChronology.java:119) 
at org.joda.time.chrono.AssembledChronology.getDateTimeMillis(AssembledChronology.java:133) 
at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:254) 
at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:223) 
at org.joda.time.DateTime.<init>(DateTime.java:264) 

同樣,你要面對的另一個問題在秋天,當它無法確定哪小時被稱爲*爲在給定的時區將會有2 * 2點鐘。帶有HourOfday和withTime的DateTime方法容易受到相同問題的影響,以及將日期時間解析爲受DST影響的時區的字符串。

可能的解決方法包括

  • 與任何固定偏移時區實例化,而不是(例如UTC)
  • 解析相同,但UTC時區
  • 在本地時區實例化一個有效時間的字符串(例如午夜),並使用加號小時向前移動直到期望的時間
  • 有保護(if語句)以保護免受轉換日期的第二小時
  • 貓CH異常,並在接下來的過渡會發生什麼(使用DateTimeZone.nextTransition)檢查,並移動前進/後退相應