Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Joda time计算持续时间_Java_Timezone_Jodatime_Dst_Leap Year - Fatal编程技术网

Java 使用Joda time计算持续时间

Java 使用Joda time计算持续时间,java,timezone,jodatime,dst,leap-year,Java,Timezone,Jodatime,Dst,Leap Year,我试图使用Joda Time来了解两个时间点之间的持续时间,每个时间点都有自己的本地时区 例如: 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 utc

我试图使用Joda Time来了解两个时间点之间的持续时间,每个时间点都有自己的本地时区

例如:

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时间方式吗?
谢谢;)

您提供的代码将起作用并考虑时区,但您不需要转换为UTC。这段代码更简单,并且执行相同的操作(使用持续时间而不是句点):


根据您使用它的方式,上面的代码可能不是一个好主意

所有以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)
DateTime ny=newdatetime(2011,3,13,2,0,0,0,DateTimeZone.forID(“美国/纽约”);
线程“main”java.lang.IllegalArgumentException中的异常:由于时区偏移转换导致的非法即时:2011-03-13T07:00:00.000
在org.joda.time.chrono.ZonedChronology.localToUTC(ZonedChronology.java:143)
在org.joda.time.chrono.ZonedChronology.getDateTimeMillis上(ZonedChronology.java:119)
位于org.joda.time.chrono.AssembledChronoloy.getDateTimeMillis(AssembledChronoloy.java:133)
位于org.joda.time.base.BaseDateTime。(BaseDateTime.java:254)
位于org.joda.time.base.BaseDateTime。(BaseDateTime.java:223)
位于org.joda.time.DateTime.(DateTime.java:264)
同样地,在秋天你将面临另一个问题,因为在给定的时区中有2*2点钟,所以无法确定所指的是哪一个小时。withHourOfday和withTime的DateTime方法易受相同问题的影响,并且会将datetimes解析为带有受DST影响的时区的字符串

可能的解决办法包括

  • 使用任何固定偏移时区(如UTC)进行实例化
  • 解析与具有UTC时区的字符串相同
  • 实例化本地时区中的有效时间(例如午夜),并使用plusHours向前移动到所需时间
  • 在过渡日期的第二个小时,有一个防护装置(if语句)来保护自己
  • 捕获异常并检查下一次转换何时发生(使用DateTimeZone.nextTransition),并相应地向后/向前移动
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)