我正在编写一些代码以根据一天中的时间进行定期调度。我将一天中的常规计划时间表示为Joda LocalTime对象。然后,通过将LocalTime转换为DateTime来创建事件实例。最初编写代码(并且仅计划“ today”的事件)时,我在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


谢谢马特!

最佳答案

考虑:

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

10-05 18:07
查看更多