【问题标题】:Converting to Eastern Time Zone (North America)转换为东部时区(北美)
【发布时间】:2016-12-19 15:40:01
【问题描述】:

我为东部时区的客户准备了这段代码:

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

客户报告说它一直在工作,直到 11 月的时间改变。现在他们报告说他们认为时间“比东部时区早 1 小时”。

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

【问题讨论】:

  • at least 4 timezones使用缩写“EST”。不要使用三字母缩写,使用 IANA 缩写,例如“America/New York”。
  • 有一点很奇怪。在谈到东部时区时,您如何证明减去 5 或 6 个小时是合理的?纽约 - 时间有偏移量 -05 或 -04 但没有 -06。 @Andy Turner 给出的链接中提到的其他区域甚至完全关闭了您想要的偏移量。

标签: java time jodatime


【解决方案1】:

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

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

顺便说一句:为了将 tz 偏移考虑在内,在这里进行像 minusHours(5) 这样的时间算术是一个错误的想法。你正在做的,也是改变给定的瞬间/时刻通过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)导致不同的瞬间。只有我的建议会产生正确的当地时间(纽约)和正确的瞬间。

【讨论】:

  • 我是否还需要为此硬编码负 5 或 6 小时?
  • @Mdjon26 哦,不,不要使用硬编码。给定的区域将自动将给定的activityDate 转换为DateTime 内的适当本地表示,UTC-05(冬季)或 UTC-04(夏季)。无需进一步操作。
【解决方案2】:

如果您使用的是 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();
}

【讨论】:

  • 这看起来不错,但我对东部时区究竟如何做到这一点有点困惑?
  • OP的问题提到了返回DateTime的方法,而不是Date
  • 这是美国东部(如纽约)
  • 编辑返回正确的日期时间和东欧时区
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 2021-09-07
  • 2021-05-18
  • 2019-01-23
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多