【问题标题】:Timezone issue with Joda-time when converting a LocalTime to a DateTime using .toDateTime()使用 .toDateTime() 将 LocalTime 转换为 DateTime 时,Joda-time 的时区问题
【发布时间】:2014-08-29 19:31:29
【问题描述】:

我正在编写一些代码来根据一天中的时间进行定期调度。我将一天中的常规时间安排为 Joda LocalTime 对象。然后我通过将LocalTime 转换为DateTime 来创建事件实例。在最初编写代码时(并且只为“今天”安排事件),我在LocalTime 上使用了toDateTimeToday() 方法,它按预期工作。但是,当我改用 toDateTime() 方法来安排未来的事件时,我开始看到 UTC 和本地本地时区之间的映射问题。

以下代码演示了我看到的问题。

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

LocalTime lt = new LocalTime(12,0);
System.out.println(" lt="+lt);

DateTime dtt = lt.toDateTimeToday();
System.out.println("dtt="+df.format(dtt.toDate()));

DateTime bdt = new DateTime();
System.out.println("bdt="+df.format(bdt.toDate()));

DateTime dt = lt.toDateTime(bdt.toInstant());
System.out.println(" dt="+df.format(dt.toDate()));

这是输出:

 lt=12:00:00.000
dtt=2014-07-08T12:00:00-0400
bdt=2014-07-08T18:01:30-0400
 dt=2014-07-08T08:00:00-0400

如您所见,dttdt 应该是相同的时间,但它们的不同之处在于本地时区偏移量。

更新

根据 Matt Johnson 的回答,我对代码做了一个简单的更改,替换为:

DateTime dt = lt.toDateTime(bdt.toInstant());

DateTime dt = new LocalDate(bdt).toDateTime(lt); 

我的代码随更改更新(加上切换到 Joda 格式)如下:

DateTimeZone.setDefault(DateTimeZone.forTimeZone(TimeZone.getDefault()));

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");

LocalTime lt = new LocalTime(12,0);
System.out.println(" lt="+lt);

DateTime dtt = lt.toDateTimeToday();
System.out.println("dtt="+dtt.toString(fmt));

DateTime bdt = new DateTime();
System.out.println("bdt="+bdt.toString(fmt));

DateTime dt = new LocalDate(bdt).toDateTime(lt);
System.out.println(" dt="+dt.toString(fmt));

这是新的(正确的!!)输出。

 lt=12:00:00.000
dtt=2014-07-09T12:00:00-0400
bdt=2014-07-09T00:15:35-0400
 dt=2014-07-09T12:00:00-0400

谢谢马特!

【问题讨论】:

标签: java datetime timezone jodatime localtime


【解决方案1】:

考虑:

LocalTime lt = new LocalTime(12, 0);        // the scheduled time
LocalDate ld = new LocalDate(2014, 7, 8);   // the day to run

DateTime dt = ld.ToDateTime(lt);

以上代码将使用默认时区。如果您的活动计划在特定时区运行,请使用:

DateTimeZone tz = DateTimeZone.forID("America/New_York");
DateTime dt = ld.ToDateTime(lt, tz);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 2013-09-03
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2013-04-17
    • 2020-06-24
    相关资源
    最近更新 更多