我正在尝试使用Joda-Time来了解两个时间点之间的持续时间,其中每个点都以其自己的本地时区给出。
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);
现在,我想知道这是否考虑到日光节省和闰年...... 另外,使用'Period'正确的Joda-Time方式来实现这一目标吗? 谢谢;)
答案 0 :(得分: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();
答案 1 :(得分:4)
根据您的使用方式,上面的代码可能不是一个好主意。
所有采用年度/月/日/小时等的int的DateTime构造函数都容易受到夏令时(DST)过渡期的影响,在这种情况下,Joda-time将抛出异常。因此,如果转换期间的小时是应用程序中的可能输入,则它将失败:
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点钟。带有HappyOfday和withTime的DateTime方法容易受到同样的问题的影响,并且将日期时间解析为具有受DST影响的时区的字符串。
可能的解决方法包括