Scala/Joda-Joda日期时间格式不适用 [英] Scala / Joda - Joda DateTimeFormat not applying
本文介绍了Scala/Joda-Joda日期时间格式不适用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
"20200406T145511.067Z"
当我尝试将其解析为Joda日期时间时,格式更改为"2020-04-06T14:55:11.067+01:00"
。由于这个问题,我试图显式地声明DateTimeFormat Joda DateTime应该返回为"yyyyMMdd'T'HHmmss.SSS'Z'"
,但似乎并不适用。我希望以预期的格式返回DateTime
对象(例如"20200406T145511.067Z"
)。
val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSS'Z'")
val itemDateTime = dateTimeFormat.parseDateTime(record.get("itemDateTime").asString)
println("Neo4J: " + record.get("assetDateTime").asString) // Neo4J: 20200406T145511.067Z
println("Joda: " + assetDateTime) // Joda: 2020-04-06T14:55:11.067+01:00
val lastUpdatedDateTime = dateTimeFormat.parseDateTime(record.get("lastUpdatedDateTime").asString)
println("Neo4J: " + record.get("lastUpdatedDateTime").asString) // Neo4J: 20200406T145511.383Z
println("Joda: " + lastUpdatedDateTime) // Joda: 2020-04-06T14:55:11.383+01:00
编辑:我已更新代码以返回正确的类型DateTime
,但现在收到无效格式错误-
java.lang.IllegalArgumentException: Invalid format: "20200406T161516.856Z" is malformed at "1516.856Z"
我不明白为什么会发生这种事。任何帮助都将不胜感激。
已更新代码:
val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSS'Z'")
val itemDateTime = dateTimeFormat.parseDateTime(record.get("itemDateTime").asString)
val itemDateTimeFormat = dateTimeFormat.print(itemDateTime)
val lastUpdatedDateTime = dateTimeFormat.parseDateTime(record.get("lastUpdatedDateTime").asString)
val lastUpdatedDateTimeFormat = dateTimeFormat.print(lastUpdatedDateTime)
if (lastUpdatedDateTime.isAfter(itemDateTime) new DateTime(lastUpdatedDateTimeFormat) else new DateTime(itemDateTimeFormat)
推荐答案
日期时间不能也不应该有格式
你不能。你在问不可能的事。您也不应该想这样做。
DateTime
表示时区中的日期和时间。它没有,因为在中不能有格式。您可以在String
中使用您喜欢的任何格式。仅在String
中,不在DateTime
中。就像您不能拥有具有格式的int
一样。您可以将int
格式化为不同的字符串,如18
、0018
、+18
和0x0012
,但int
保持不变。
这太好了!除了最简单的丢弃程序之外,所有程序中的良好实践都告诉我们要将模型和表示分开。您的日期和时间属于您的模型,这是我们需要您的DateTime
的地方。它看起来如何,它的形式,是一个呈现的问题。此不属于您的模型。
DateTime
对象来满足自己,而不必担心格式,因为它没有任何格式。无论何时需要使用您提到的紧凑格式的字符串,请使用相同的格式化程序将DateTime
格式化为此类字符串。
您的分析中存在错误
您没有问这个,但您应该想知道。
println("Neo4J: " + record.get("assetDateTime").asString) // Neo4J: 20200406T145511.067Z
println("Joda: " + assetDateTime) // Joda: 2020-04-06T14:55:11.067+01:00
请仔细查看评论中的日期时间。它们是不同的。前者以UTC为单位,由尾部Z
表示。是的,Z
是来自UTC的零偏移量。后一个日期时间具有相同的小时数和不同的UTC偏移量+01:00
。因此,它指定的不同时间点等于UTC 2020-04-06T13:55:11.067。
Z
,方法是将其括在单引号中。永远不要那样做。需要将偏移量解析为偏移量。在格式模式字符串中为此使用ZZ
。用Java(因为这是我能写的):
DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSSZZ");
String assetDateTimeString = "20200406T145511.067Z";
DateTime itemDateTime = dateTimeFormat.parseDateTime(assetDateTimeString);
System.out.println(itemDateTime);
我在欧洲/伦敦时区运行时的输出:
2020-04-06T15:55:11.067+01:00
如果要保留字符串的偏移量,请告诉格式化程序:
DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSSZZ")
.withOffsetParsed();
2020-04-06T14:55:11.067Z
这篇关于Scala/Joda-Joda日期时间格式不适用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文