无法使用 SimpleDateFormat 解析带有区域信息的日期

Can't parse date with zone information using SimpleDateFormat

我有

格式:dd-MM-yyyy'T'HH:mm:sszzz

语言环境:en_US

日期:01-02-2016T10:00:00+01:00

zoneId: Europe/Warsaw

我打电话给:

new SimpleDateFormat(format, locale).parse(date).toInstant().atZone(zoneId)

我得到 Unparseable date: "01-02-2016T10:00:00+01:00"

是否有使用 SimpleDateFormat 的选项,或者我是否需要将其更改为其他格式?

要匹配 "01-02-2016T10:00:00+01:00",您的格式字符串应为 "dd-MM-yyyy'T'HH:mm:ssXXX"。你有 zzz 而你应该有 XXX。见 javadoc.

此外,这是一种使用起来很奇怪的格式。通常,当看到日期和时间部分之间的 T 分隔符时,它表示 ISO8601 format (or an ISO8601-based format such as RFC3339)。但是,在该格式中,日期按 year-month-day 顺序排列。您有 day-month-year 个订单。这种矛盾在某些时候肯定会引起混乱。我强烈建议更改此数据的来源以使用正确的顺序,或将 T 替换为 space,并在 tz 偏移量之前放置一个 space。

换句话说,您的数据应如下所示:

"01-02-2016 10:00:00 +01:00"  // Human-readable, but locale-specfic

"2016-02-01T10:00:00+01:00"   // ISO8601 / RFC3339 compliant

没有

"01-02-2016T10:00:00+01:00"   // Nonsense