3

我正在使用 joda time 来格式化我的 ISO 日期输入字符串,但我收到一个异常,即我的 ISO 日期格式错误:

Invalid format: "2014-06-20T11:41:08+02:00" is malformed at "+02:00"

这是我的代码:

val formatter: DateTimeFormatter = ISODateTimeFormat.dateTime.withZone(DateTimeZone.getDefault)
val date: DateTime = formatter.parseDateTime("2014-06-20T11:41:08+02:00")

这里有什么问题?

4

2 回答 2

7

错误注释在这里有点误导,因为您从中派生的 Joda 格式化程序ISODateTimeFormat期望日期/时间字符串的毫秒部分存在,因此以下内容可以正常工作:

val formatter: DateTimeFormatter = ISODateTimeFormat.dateTime().withZone(DateTimeZone.getDefault())
val date: DateTime = formatter.parseDateTime("2014-06-20T11:41:08.0+02:00")
于 2014-06-20T09:59:11.593 回答
4

Radyk的回答是正确的。

内置 ISO 8601 格式

但是,您根本不需要指定格式化程序。该类DateTime有一个内置的符合ISO 8601格式的解析器,由构造函数自动使用。

DateTime dateTime = new DateTime( "2014-06-20T11:41:08+02:00", timeZone );

虽然第二个参数是可选的,但如果您知道这样的时区,我建议您分配一个DateTimeZone对象以分配给 DateTime。输入字符串与 UTC 有一个偏移量,但时区不仅仅是一个偏移量。时区包括夏令时规则和其他异常情况。使用正确的时区名称,切勿使用 3 或 4 个字母代码,例如ESTor IST

其他格式

您可以应用许多其他格式:

例如,如果您只希望在字符串表示中没有时间的日期部分,请调用ISODateTimeFormat.date()以访问内置格式化程序。

Joda-Time 2.8 中的示例代码。

String output = ISODateTimeFormat.date().print( dateTime );  // Format: yyyy-MM-dd

在 StackOverflow 中搜索数百个有关格式化日期时间值的其他问题和解答。

于 2014-06-20T10:09:08.197 回答