我正在使用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"
有什么想法吗?
答案 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 5中X
无法使用的{{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
中指定(即,问题在于时间戳的时区组件的格式)。