我正在编写一些代码来根据时间进行定期调度。我代表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
如您所见,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
谢谢马特!
答案 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);