【发布时间】:2020-09-29 14:04:43
【问题描述】:
我正在尝试将格式为 2020-06-09T06:30:00Z 的 UTC 日期字符串转换为像 Asia/Calcutta 这样的时区。
UTC 和 Asia/Calcutta 之间的时间偏移是 +5:30,因此将 2020-06-09T06:30:00Z 转换为 Asia/Calcutta 的预期结果是 2020-06-09T12:00:00Z,但我得到的是 2020-06-09T01:00:00Z
String utcDate = "2020-06-09T06:30:00Z";
String timezone = "Asia/Calcutta";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
LocalDateTime date = LocalDateTime.parse(utcDate, formatter); //2020-06-09T06:30
ZonedDateTime zonedDate = ZonedDateTime.of(date, ZoneId.of(timezone)); //2020-06-09T06:30+05:30[Asia/Calcutta]
Date dateConverted = Date.from( zonedDate.toInstant()); //Tue Jun 09 01:00:00 UTC 2020
我认为zonedDate.toInstant() 正在转换减去5:30 而不是将5:30 添加到2020-06-09T06:30。我的机器在 UTC 时区。可能是它转换为当地时间不知道是什么问题。也试过下面的方法,还是一样的问题。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone(timezone));
sdf.parse(dateString);
【问题讨论】:
-
我认为你做错了。当您解析日期并设置时区时。它将理解 06:30 是 GMT+5:30 时区。然后当你打印出来的时候。它将打印 GMT+0 值。根据需要进行转换。先按 zonedDateTime 解析
-
@user3562932 是的。刚刚使用 SimpleDateFormat 让它工作。如果您可以使用 ZonedDateTime 发布更正,那也会有帮助
-
欢迎接受您自己的答案。将问题清楚地标记为已回答将有助于其他读者。