Scala/Joda-Joda日期时间格式不适用 [英] Scala / Joda - Joda DateTimeFormat not applying

查看:17
本文介绍了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格式化为不同的字符串,如180018+180x0012,但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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆