【问题标题】:java date parse exception while conveting UTC to local time zone将UTC转换为本地时区时java日期解析异常
【发布时间】:2015-04-17 15:20:25
【问题描述】:

我得到了一个以下格式的 UTC 日期,如何将此 UTC 日期转换为我的本地时区?

我的输入日期是2015-03-17 06:00:00 +0000,我尝试了以下编码,它给出了解析异常。

我的代码:

DateFormat utcFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss 'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2015-03-17 06:00:00 +0000"); // java.text.DateFormat.parse(Unknown Source)
utcFormat.setTimeZone(TimeZone.getDefault());
System.out.println(utcFormat.format(date));

【问题讨论】:

标签: java java-time


【解决方案1】:

您的代码中有两个错误。

  1. 正如其他人已经提到的,您在 Z 周围的模式中有额外的 '
  2. 您将模式指定为dd-MM-yyyy,但尝试将日期解析为yyyy-MM-dd

正确版本:

DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2015-03-17 06:00:00 +0000");
utcFormat.setTimeZone(TimeZone.getDefault());
System.out.println(utcFormat.format(date));

【讨论】:

    【解决方案2】:

    我认为这是由于日期模式中的引号引起的。

    试试这个...

    DateFormat utcFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss ZZZZ");
    

    【讨论】:

      【解决方案3】:

      删除围绕 Z 的 ' 并重试。

      【讨论】:

      • 这还不够。
      【解决方案4】:

      我想提供现代答案。问题中使用的DateSimpleDateFormat 类早已过时,而今天我们有了更好的选择。我推荐称为 JSR-310 或 java.time 的现代 Java 日期和时间 API:

          DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss Z");
          System.out.println(ZonedDateTime.parse("2015-03-17 06:00:00 +0000", formatter)
                  .withZoneSameInstant(ZoneId.systemDefault())
                  .format(formatter));
      

      在我位于欧洲/哥本哈根时区的电脑上打印

      2015-03-17 07:00:00 +0100
      

      不过,使用ZoneId.systemDefault() 是脆弱的,因为任何在JVM 上运行的程序都可以更改其默认时区,从而改变上述sn-p 的行为。如果可以,最好使用 region/city 格式的时区 ID,例如 ZoneId.of("Asia/Tomsk")ZoneId.of("America/Argentina/Rio_Gallegos")

      问题:我可以在我的 Java 版本中使用现代 API 吗?

      如果至少使用 Java 6,则可以。

      【讨论】:

        【解决方案5】:

        此函数经过测试,可与任何 java.util.Date 对象完美配合。

        private SimpleDateFormat getDateFormat() {
            SimpleDateFormat dateFormat = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.DEFAULT, Locale.getDefault());
            String pattern = dateFormat.toLocalizedPattern();
            pattern = pattern.trim();
            dateFormat.applyLocalizedPattern(pattern);
            return dateFormat;
        }
        
        //And here is the usage
        SimpleDateFormat sdf = getDateFormat();
        sdf.format(new Date());
        

        我从以下网站重构了代码,您可能会发现它对格式化为不同类型的 java.util.Date 对象很有用:

        https://www.programcreek.com/java-api-examples/index.php?class=java.text.SimpleDateFormat&method=applyLocalizedPattern

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-07
          相关资源
          最近更新 更多