解析包含日期,时间和时间的时间戳。抵消

时间:2015-01-09 14:22:21

标签: java date iso8601

我正在使用Java 5

我需要以ISO 8601格式解析日期时间字符串,例如2011-11-30T12:00:00.000+00:00

String dateString = "2011-11-30T12:00:00.000+00:00";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
Date parsed=null;
try {
    parsed = df.parse(dateString);
}

我也尝试过这种模式:yyyy-MM-dd'T'HH:mm:ss.SSSz,但结果相同:

java.text.ParseException: Unparseable date: "2011-11-30T12:00:00.000+00:00"

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

约达时间

如果您不想手动解析,则必须使用Joda-Time (Maven)(支持Java 1.5)。只需使用new DateTime(String)创建一个对象,就可以通过Date方法获得toDate()

时区

将要分配的时区传递给生成的日期时间对象。与java.util.Date不同,Joda-Time DateTime对象知道自己指定的时区(DateTimeZone)。如果省略,则隐式分配JVM的当前默认时区。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" ); // Or perhaps DateTimeZone.UTC
DateTime dateTime = new DateTime( "2011-11-30T12:00:00.000+00:00", zone );

答案 1 :(得分:3)

您应该从+00:00中移除冒号,因为此格式仅适用于Java 5X无法使用的{{1}}模式,仅适用于Java SE 7

更多信息:RFC822需要这种风格(没有冒号),在ISO 8601中都是正确的。

答案 2 :(得分:1)

SimpleDateFormat构造函数yyyy-MM-dd'T'HH:mm:ss.SSSZ中当前使用的模式应该接受以下格式的时间戳:

2011-11-30T12:00:00.000+0000

但是,您需要的是能够处理时间戳的内容,例如:

2011-11-30T12:00:00.000+00:00

出于此特定目的,yyyy-MM-dd'T'HH:mm:ss.SSSXXX格式应在SimpleDateFormat中指定(,问题在于时间戳的时区组件的格式)。