2011-02-13 140 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)检查,并移动前进/后退相应