将UTC转换为本地时区时的Java日期解析异常

时间:2015-04-17 15:20:26

标签: java java-time

我收到以下格式的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));

5 个答案:

答案 0 :(得分:3)

您的代码中有两个错误。

  1. 正如其他人已经提到的那样,您的模式中'附近有Z
  2. 您将模式指定为dd-MM-yyyy,但尝试将日期解析为yyyy-MM-dd
  3. 正确版本:

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

答案 1 :(得分:1)

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

试试这个......

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

答案 2 :(得分:1)

删除'周围的Z并重试。

答案 3 :(得分:1)

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

    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上运行的任何程序都可以更改其默认时区,从而改变上述代码段的行为。如果可以,最好使用 region / city 格式的时区ID,例如ZoneId.of("Asia/Tomsk")ZoneId.of("America/Argentina/Rio_Gallegos")

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

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

答案 4 :(得分:0)

此函数经过测试,可与任何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

希望这有帮助