【发布时间】: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
如您所见,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
谢谢马特!
【问题讨论】:
-
您的结果因使用
toDate而变得模糊不清。考虑改用Joda-Time's Formatters 输出。
标签: java datetime timezone jodatime localtime