【发布时间】:2015-04-30 08:31:20
【问题描述】:
我正在尝试将带有 GMT +5:30 的日期转换为带有 java 8 ZonedDateTime 的 EST。
String inputDate = "2015/04/30 13:00";
DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm", Locale.US);
LocalDateTime local = LocalDateTime.parse(inputDate, sourceFormatter);
// local : 2015-04-30T13:00
//Combining this local date-time with a time-zone to create a ZonedDateTime.
ZonedDateTime zoned = local.atZone(TimeZone.getTimeZone("GMT+5:30").toZoneId());
// zoned : 2015-04-30T13:00+05:30[GMT+05:30]
ZonedDateTime zonedUS = zoned.withZoneSameInstant(TimeZone.getTimeZone("GMT-5:00").toZoneId());
// zonedUS : 2015-04-30T02:30-05:00[GMT-05:00]
我期待3:30 AM EST,但我得到的是2:30 AM EST 和1 PM IST= 3:30AM EST。我错过了什么?
【问题讨论】:
-
嗯,这对我来说是正确的。 13:00+05:30 = 07:30 UTC = 02:30-05:00。您在 +05:30 和 -05:00 之间有 10:30 的差异,而 13:00-10:30 是 02:30... 为什么您会期待凌晨 03:30?请注意,东部时间目前是 UTC-4,因为它是美国东部时间而不是美国东部标准时间......所以当时纽约的时间例如是 03:30。
-
@JonSkeet 当我用谷歌搜索
time EST时,它显示我在美国东部标准时间上午 3:30 下午 1:00 IST。是因为夏令时吗? -
如果您显示的内容实际上声称它是美国东部标准时间凌晨 3:30,那么您展示的内容就是不准确的。这可能意味着东部时间凌晨 3:30,而不是东部时间(实际上这就是谷歌搜索向我显示的内容)......东部时间始终是 UTC-5,而东部时间在东部时间 (UTC-5) 和东部时间 (UTC-4) 之间变化.如果您想要东部时间,您应该使用“America/New_York”的区域 ID。 (我通常建议使用基于位置的区域 ID,而不是一般的偏移 ID...)
-
@JonSkeet。感谢您对此question 的回答得到了解决方案
-
@Zeeshan 经验教训:避免使用那些 3-4 个字母的代码。使用proper time zone names。示例:
America/New_York或America/Montreal。