当前位置: 首页 > 面试题库 >

由于时区偏移过渡,如何处理Jodatime非法瞬间

龙毅
2023-03-14
问题内容

我想将joda设置DateTime为今天凌晨2点(请参见下面的示例代码)。但是我得到了这个例外:

Exception in thread "main" org.joda.time.IllegalFieldValueException: Value 2 for hourOfDay is not supported: Illegal instant due to time zone offset transition: 2011-03-27T02:52:05.239 (Europe/Prague)
at org.joda.time.chrono.ZonedChronology$ZonedDateTimeField.set(ZonedChronology.java:469)
at org.joda.time.MutableDateTime.setHourOfDay(MutableDateTime.java:702)

解决上面的异常或DateTime在一天的特定时间创建异常的正确方法是什么?

样例代码:

MutableDateTime now = new MutableDateTime();
now.setHourOfDay(2);
now.setMinuteOfHour(0);
now.setSecondOfMinute(0);
now.setMillisOfSecond(0);
DateTime myDate = now.toDateTime();

谢谢。


问题答案:

似乎您正在尝试从特定的本地时间到达DateTime实例,并且您希望该功能对日光节约具有强大的作用。试试这个…(请注意,我在美国/东部,所以我们的过渡日期是2011年3月13日;我必须找到正确的日期来获取您今天遇到的例外。下面更新了我的CET代码,该代码今天开始过渡。
)此处的见解是,乔达(Joda)提供了相关信息LocalDateTime,可让您推断本地壁钟设置以及在您所在时区是否合法。在这种情况下,如果时间不存在,我只添加一个小时(您的应用程序必须确定这是否是正确的策略。)

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDateTime;

class TestTz {

  public static void main(String[] args)
  {
     final DateTimeZone dtz = DateTimeZone.forID("CET");
     LocalDateTime ldt = new LocalDateTime(dtz)
       .withYear(2011)
       .withMonthOfYear(3)
       .withDayOfMonth(27)
       .withHourOfDay(2);

    // this is just here to illustrate I'm solving the problem; 
    // don't need in operational code
    try {
      DateTime myDateBorken = ldt.toDateTime(dtz);
    } catch (IllegalArgumentException iae) {
      System.out.println("Sure enough, invalid instant due to time zone offset transition!");
    }

    if (dtz.isLocalDateTimeGap(ldt)) {
      ldt = ldt.withHourOfDay(3);
    }

    DateTime myDate = ldt.toDateTime(dtz);
    System.out.println("No problem: "+myDate);
  }

}

此代码产生:

当然,由于时区偏移转换,无效瞬间!
没问题:2011-03-27T03:00:00.000 + 02:00


 类似资料:
  • 在我的网站中,用户A创建了一个从上午9:00开始的事件。我将该时间转换为GMT,这样,如果用户B在两小时前的不同时区看到该事件,它可以转换为用户B的时区,并显示该事件在11:00AM开始。 我唯一的想法是,当我得到如下所示的时区偏移量时,我是否应该总是将日期设置为一月,以便无论实际月份如何,我总是得到相同的时区偏移量?或者有没有更好的方法来处理这件事?

  • 我试图用android的JodaTime库解析ISO格式的日期,但得到了错误的时区偏移量。 我的默认时区是“欧洲/莫斯科”,但结果是“1990-05-04T00:00:00.000 0400”,而它应该是“1990-05-03T23:00:00.000 0300”。Android版本是KitKat。 我做错了什么?

  • 我创建了以下示例代码来演示这种行为,并展示我提出的解决方案。 } 产出:

  • 问题内容: 这是来自Apache日志的示例日期: 我已经成功地将其解析为year(int),month(time.Month),day(int),hour(int),minute(int),second(int)和timezone(string)。 如何构造time.Time,使其包含时区偏移量? 这是我到目前为止的内容: 我应该用什么代替?或在这里不合适。 问题答案: 您可以使用构造具有固定偏移

  • 我有一个由5个分区组成的主题如下: 似乎分区的偏移量非常接近其余分区的偏移量之和。我不知道如何以及为什么。

  • 问题内容: 我需要下一个流程: nodejs utils api中有这种可能性吗? 问题答案: 您可以使用node-time,如下所示: