【发布时间】:2022-01-15 06:43:31
【问题描述】:
在 Java 11 中,时钟系统使用毫秒精度,但显然在 Java 13 及更高版本中,它使用微秒精度,这导致我的测试失败。例如,OffsetDateTime.now() 给了我这个日期“2021-12-10T10:58:05.309594500+01:00”,而当我从数据库“2021-12-10T10:58:05.309595+01:00”中读取这个日期时。我正在寻找一种方法,我可以以它们应该相等的方式格式化第一个日期。我确实希望它在 OffsetDateTime 类型而不是字符串中。
更新: 我意识到这个问题是在我将 java 版本从 11 升级到 17 而不是在本地时出现的,当 gitlab 运行测试时我遇到了这个问题。
这是测试:
@Test
fun `can store, find and delete a failed-message`() {
// given: a failed-message
val failedMessage = FailedMessage(
failedMessageId = FailedMessageId("the-subcription", "the-message-id"),
messageAttributes = mapOf("one" to "een", "two" to "twee"),
messagePayload = "message-payload",
exception = "exception",
dateTime = OffsetDateTime.now(),
stackTrace = "stackey tracey"
)
failedMessageRepository.store(failedMessage)
assertEquals(failedMessage, failedMessageRepository.find(failedMessage.failedMessageId))
}
由于日期时间不相等,此测试失败。这是日志:
<FailedMessage(failedMessageId=the-subcription-the-message-id, messageAttributes={one=een, two=twee}, messagePayload=message-payload, exception=exception, dateTime=2021-12-10T10:58:05.309594500+01:00, stackTrace=stackey tracey)>
but was:
<FailedMessage(failedMessageId=the-subcription-the-message-id, messageAttributes={one=een, two=twee}, messagePayload=message-payload, exception=exception, dateTime=2021-12-10T10:58:05.309595+01:00, stackTrace=stackey tracey)>
你能帮帮我吗?
【问题讨论】:
-
使用数字较少的格式化程序,在格式化之前截断值等。IIRC,这也可能发生在 Java 11 中,具体取决于实际的 JVM 和您正在运行的平台。
-
在你的情况下截断有用吗?像这样:
OffsetDateTime.now().truncatedTo(ChronoUnit.MICROS); -
我相信这种模式会将 OffsetDateTime 格式化为所需的字符串
yyyy-MM-d'T'HH:mm:ss.SSSSSSSXXX -
格式化意味着转换为字符串。请决定是否需要任何格式。
-
您从数据库中读取的值被截断为微秒——秒有 6 位小数。所以我看不出@TomaszPieczkowski 的建议有什么问题?
标签: java datetime java-11 java-17 offsetdatetime