Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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:org.Joda.time.IllegalInstantException:由于时区偏移转换(夏时制时间间隔)而导致的非法瞬间_Java_Android_Datetime_Timezone_Jodatime - Fatal编程技术网

Java Joda:org.Joda.time.IllegalInstantException:由于时区偏移转换(夏时制时间间隔)而导致的非法瞬间

Java Joda:org.Joda.time.IllegalInstantException:由于时区偏移转换(夏时制时间间隔)而导致的非法瞬间,java,android,datetime,timezone,jodatime,Java,Android,Datetime,Timezone,Jodatime,在Android设备(7.0)上,出现以下崩溃: Fatal Exception: org.joda.time.IllegalInstantException: Illegal instant due to time zone offset transition (daylight savings time 'gap'): 1977-05-01T00:00:00.000 (Africa/Casablanca) at org.joda.time.chrono.ZonedChronol

在Android设备(7.0)上,出现以下崩溃:

Fatal Exception: org.joda.time.IllegalInstantException: Illegal instant due to time zone offset transition (daylight savings time 'gap'): 1977-05-01T00:00:00.000 (Africa/Casablanca)
       at org.joda.time.chrono.ZonedChronology.localToUTC(ZonedChronology.java:157)
       at org.joda.time.chrono.ZonedChronology.getDateTimeMillis(ZonedChronology.java:122)
       at org.joda.time.chrono.AssembledChronology.getDateTimeMillis(AssembledChronology.java:133)
       at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:257)
       at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:198)
       at org.joda.time.DateTime.<init>(DateTime.java:323)

我不明白为什么在这个时区失败了。如果我使用另一个时区(如GMT+1),根本没有问题。

这是因为1977年5月1日,卡萨布兰卡改用夏令时:

午夜时分,时钟被提前1小时到凌晨1点。它就像是从晚上11:59:59直接跳到凌晨1点,所以在那个时区,在那个日期,午夜是不存在的。这被称为差距(或者DST差距,如果您愿意的话)

Joda Time将其解释为您正在处理的时区的无效值,因此出现异常

如果不希望出现异常,可以首先检查本地日期和时间在该时区是否有效:

LocalDateTime ld=newlocaldatetime(1977,5,1,0,0,0,0);
DateTimeZone=DateTimeZone.forID(“非洲/卡萨布兰卡”);
System.out.println(zone.isLocalDateTimeGap(ld));//真的
//如果不是间隙(isLocalDateTimeGap为false),则可以安全地创建DateTime
DateTime d=ld.toDateTime(区域);
在本例中,它将打印
true
,因为1977年5月1日午夜是卡萨布兰卡时区的一个间隙,因此为这些值创建
DateTime
将引发异常


这不会发生在其他时区,因为它们有不同的DST规则,并且日期和时间对它们有效。

这是因为1977年5月1日,卡萨布兰卡切换到夏时制:

午夜时分,时钟被提前1小时到凌晨1点。它就像是从晚上11:59:59直接跳到凌晨1点,所以在那个时区,在那个日期,午夜是不存在的。这被称为差距(或者DST差距,如果您愿意的话)

Joda Time将其解释为您正在处理的时区的无效值,因此出现异常

如果不希望出现异常,可以首先检查本地日期和时间在该时区是否有效:

LocalDateTime ld=newlocaldatetime(1977,5,1,0,0,0,0);
DateTimeZone=DateTimeZone.forID(“非洲/卡萨布兰卡”);
System.out.println(zone.isLocalDateTimeGap(ld));//真的
//如果不是间隙(isLocalDateTimeGap为false),则可以安全地创建DateTime
DateTime d=ld.toDateTime(区域);
在本例中,它将打印
true
,因为1977年5月1日午夜是卡萨布兰卡时区的一个间隙,因此为这些值创建
DateTime
将引发异常

它不会发生在其他时区,因为它们有不同的DST规则,并且日期和时间对它们有效

// Failed:
DateTime dateTime = new DateTime(year, month, 1);

// Failed
DateTime dateTime = new DateTime(year, month, 1, 0, 0, 0, 0,
  DateTimeZone.forID(TimeZone.getDefault().getID()));

// Failed
DateTime dateTime = new DateTime(year, month, 1, 0, 0, 0, 
  DateTimeZone.forTimeZone(TimeZone.getDefault()));