转换到东部时区(北美)

时间:2016-12-19 15:40:01

标签: java time jodatime

我在东部时区为客户提供了这段代码:

public DateTime getActivityDate() {
    return new DateTime(activityDate, DateTimeZone.UTC).minusHours(5);
}

客户报告说它一直在工作,直到11月份的时间改变为止。现在,他们正在报道他们正在看到的时代和#34;比东部时区提前1小时。"

有没有什么方法可以让我的工作节省时间和标准时间,而不是将它硬编码为minusHours(5)和minusHours(6)?

2 个答案:

答案 0 :(得分:2)

是的,请在纽约使用适当的时区标识符 - 时间:

return new DateTime(activityDate, DateTimeZone.forID("America/New_York"));

顺便说一下:在这里做minusHours(5)这样的时间算术是错误的想法,以便考虑到tz偏移。你在做什么,也在改变瞬间/由activityDate给出的时刻,而不仅仅是在适当的时区更改本地表示。显示代码与提案之间差异的示例:

System.out.println(new DateTime(new Date(), DateTimeZone.forID("America/New_York"))); 
// 2016-12-19T11:05:58.507-05:00

System.out.println(new DateTime(new Date(), DateTimeZone.UTC).minusHours(5)); 
// 2016-12-19T11:05:58.573Z

我们有相同的“局部”表示但不同的偏移(-05对Z = + 00)导致不同的瞬间。只有我的提议能够产生正确的当地时间(纽约)和正确的时间。

答案 1 :(得分:1)

如果您使用的是org.joda.time.DateTime:

public static final DateTime getEasternUSLocalDateTime(DateTime pDateTimeUtc) {

    // Convert the Date
    DateTime convertedDate  = originalDate.withZone(DateTimeZone.forID("America/New_York"));
    // Return the localTime associated with the timeZone
    return convertedDate.toLocalDateTime();
}