我生成一个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日期时间字符串?
答案 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正确提到的那样。