具有冒号分隔时区的Unparsable Date

时间:2014-04-04 13:43:25

标签: java parsing date simpledateformat

我正在尝试解析此String

  

2014-04-04T14:28:38 + 02:00

它应该是ISO 8601格式。但我不能解析它到正确的日期。 我尝试了以下内容:

   String example = "2014-04-04T14:28:38+02:00"
   public final static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz")
   Date tempDate = df.parse(example)

但我总是得到“无法解析日期”的消息 我无法更改示例,因为它是来自Web服务的值。

是否存在“+02:00”代替“+0200”的问题?

非常感谢

3 个答案:

答案 0 :(得分:2)

java.time

现代日期时间 API 基于 ISO 8601,因此,您不需要显式使用解析器(例如 DateTimeFormatter)来解析给定的日期时间字符串已经采用 ISO 8601 格式。

演示:

import java.time.OffsetDateTime;
import java.util.Date;

public class Main {
    public static void main(String args[]) {
        OffsetDateTime odt = OffsetDateTime.parse("2014-04-04T14:28:38+02:00");
        System.out.println(odt);

        // In case you need java.util.Date
        Date date = Date.from(odt.toInstant());
        // ...
    }
}

输出:

2014-04-04T14:28:38+02:00

modern date-time API 中了解有关 Trail: Date Time* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 1 :(得分:1)

从Java7开始,要处理+02:00,您可以使用以下格式:

"yyyy-MM-dd'T'hh:mm:ssXXX"

这可以在SimpleDateFormat documentation

中看到

答案 2 :(得分:0)

可以使用Joda Time最容易地解析ISO8601日期格式,可以将其用作库。

似乎Joda Time的一种形式进入Java 8 JSR310,但我没有使用它。