Joda:如何使用" Z"生成ISO日期时间字符串在和

时间:2014-04-27 16:33:55

标签: scala jodatime

我生成一个ISO日期时间字符串(没有时区),如下所示:

val dateTime: LocalDateTime = LocalDateTime.now
val dateTimeStr: String = ISODateTimeFormat.dateTime.withZone(DateTimeZone.UTC).print(dateTime)

上面的代码生成以下字符串:

2014-04-10T06:13:19.283

现在我需要将此字符串转换回LocalDateTime ...

val dateTime = LocalDateTime.parse(dateTimeStr, ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC))

...并将其与当前时间进行比较:

val isBefore = dateTime.isBefore(LocalDateTime.now)

上面的代码不起作用并产生以下错误:

Invalid format: \"2014-04-27T17:51:06.780\" is too short

要解决此问题,我需要将Z附加到dateTimeStr

val dateTime = LocalDateTime.parse(s"${dateTimeStr}Z", ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC))

有没有办法在最后生成带有Z的ISO日期时间字符串?

2 个答案:

答案 0 :(得分:3)

尝试使用

val dateTime: DateTime = DateTime.now

而不是

val dateTime: LocalDateTime = LocalDateTime.now

或者,如果您想坚持LocalDateTime更改解析:

val dateTime = LocalDateTime.parse(dateTimeStr)  // this uses the default localDateOptionalTimeParser

答案 1 :(得分:3)

LocalDateTime没有时区。因此,您无法将时区感知格式(Z代表UTC时区)与此无区域数据类型相关联。

如果你坚持使用Z格式,那么你必须使用像DateTime这样的全局类型。所以你有两个不同的步骤。一步是本地和全局类型之间的对象转换:

LocalDateTime ldt = ...;
DateTime dt = ldt.toDateTime(DateTimeZone.UTC); // or another timezone

// reverse
DateTime dt = ...;
LocalDateTime ldt = dt.toLocalDateTime();

第二步是格式化字符串表单和全局时间戳之间的转换:

LocalDateTime ldt = ...;
DateTime dt = ldt.toDateTime(DateTimeZone.UTC); // or another timezone
String iso = ISODateTimeFormat.dateTime().print(dt);

// reverse
String iso = ...; // with trailing Z or another timezone information
DateTime dt = IsoDateTimeFormat.parseDateTime(iso);
LocalDateTime ldt = dt.toLocalDateTime();

最后,您可以将这两个步骤结合起来,以便在ISO格式与时区信息和LocalDateTime之间进行转换,如第二步所示。

如果您只需要没有任何时区或偏移信息的格式化字符串,那么您可以完全粘贴全局类型DateTime,只需使用localDateOptionalTimeParser(),如@Sebastian正确提到的那样。