当前位置: 首页 > 知识库问答 >
问题:

将UTC日期转换为给定时区时出现错误值

齐阳
2023-03-14

我正在尝试将格式为2020-06-09T06:30:00Z的UTC日期字符串转换为类似Asia/Calcutta的时区。

UTCAsia/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);

共有1个答案

柳鸿博
2023-03-14

我同意您的观点,您应该强烈倾向于使用Java.time,即现代Java日期和时间API。当你知道怎么做的时候就不复杂了。

    String utcDate = "2020-06-09T06:30:00Z";
    String timezone = "Asia/Calcutta";

    ZoneId zone = ZoneId.of(timezone);
    ZonedDateTime zdt = Instant.parse(utcDate).atZone(zone);

    System.out.println("zdt: " + zdt);

输出为:

ZDT:2020-06-09T12:00+05:30“亚洲/加尔各答”

    Date oldfashionedDate = Date.from(Instant.parse(utcDate));
    System.out.println("oldfashionedDate: " + oldfashionedDate);

您可能会怀疑日期是否正确。是的。由于我在欧洲/哥本哈根时区,当前偏移量+02:00,date在这个时区打印,因此一天中的时间是8:30(date不包含时区或偏移量)。如果我在亚洲/加尔各答时区跑步:

老式日期:2020年6月9日12:00:00

您注意到ist代表印度标准时间,而不是cest代表中欧夏季时间。和预期的一样,时间是12点。

  • 切勿将z硬编码为格式模式字符串中的文字。正如我所说的,它是一个偏移量,因此需要将其解析为偏移量。
  • 出于同样的原因,不要解析为localdatetimelocaldatetime。没有任何偏移,因此您正在丢失信息。
  • 在这种情况下,根本不使用格式化程序。您的格式是ISO 8601,而instant将其解析为默认格式,即不使用任何显式格式化程序(offsetdatetimezoneddatetime也可以)。
  • 将UTC转换为亚洲/加尔各答。在我看来,你似乎在做相反的转换。

维基百科文章:ISO 8601

 类似资料:
  • 问题内容: 我从我的API获取此日期字符串: 但是此日期为UTC格式,我想将其转换为当地时间,该怎么办? 我尝试了这个: 但是它返回了这个错误: 问题答案: 您的日期格式模式错误。改成: 有关更多信息,请参见SimpleDateFormat的javadoc。

  • 问题内容: 这是我的约会日期“ 15-05-2014 00:00:00” 如何将IST转换为UTC即(到14-05-2014 18:30:00) 基于时区到UTC时区。 我的代码是 如果用户从任何区域输入相同的日期,则将获得UTC时间(例如:从澳大利亚,然后从15-05-2014 00:00:00到14-05-2014 16:00:00) 请任何建议。 问题答案: 您不能将日期值“转换为”其他时区

  • > 如何将IST转换为UTC,即(至2014年5月14日18:30:00) 我的代码是 > 如果用户从任何区域输入相同的日期,则将获得UTC时间(例如:从澳大利亚输入,然后是2014年5月15日00:00:00至2014年5月14日16:00:00) 请提出任何建议。

  • 问题内容: 为您准备的头抓板。 我正在从IPInfoDB的API中获取地理IP数据,它从UTC返回 包括 DST 的时区偏移(如果当前已反映)。 例如,我住在EST(-5),目前是DST,因此geo IP API返回()作为偏移量。 因为DST令人头疼,所以这太好了。但是令我惊讶的是,它又引起了头疼。 我将此数据加载到PHP中,以通过AJAX传递给应用程序。我想在应用程序上获取IP地址的实时本地时

  • 问题内容: 我需要一种简便的方法,可以在不使用任何库的情况下将日期时间戳转换为UTC(从服务器所在的任何时区)。 问题答案: 尝试getTimezone和setTimezone,请参见示例 (但这确实使用了一个类) 更新: 没有任何类,您可以尝试这样的事情: 注意:您可能还需要将时区设置回原始