使用.toDateTime()将LocalTime转换为DateTime时Joda-time的时区问题

时间:2014-07-08 22:20:05

标签: java datetime timezone jodatime localtime

我正在编写一些代码来根据时间进行定期调度。我代表Joda LocalTime对象定期安排时间。然后,我将LocalTime转换为DateTime来创建事件实例。在最初编写代码时(并且仅为"今天"安排事件)我在toDateTimeToday()上使用了LocalTime方法,并且它按预期工作。但是,当我切换到使用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

谢谢马特!

1 个答案:

答案 0 :(得分:2)

考虑:

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);