解析包含日期、时间和偏移量的时间戳

Parsing a timestamp containg the date, time & offset

我正在使用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"

有什么想法吗?

您应该从 +00:00 中删除冒号,因为此格式仅适用于 X 模式,而 Java 5, only from Java SE 7 中不可用。

更多信息:RFC822 需要这种样式(不带冒号),在 ISO 8601 中两者都是正确的。

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

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

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

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

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

乔达时间

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

时区

将要分配给生成的日期时间对象的时区传递。与 java.util.Date 不同,Joda-Time DateTime object knows its own assigned time zone (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 );