我正在编写一些代码以根据一天中的时间进行定期调度。我将一天中的常规计划时间表示为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
如您所见,
dtt
和dt
应该是相同的时间,但是它们之间的时区偏移是不同的。更新
根据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);