【问题标题】:Java Date conversion to String and back to Date, fail equality checkJava 日期转换为字符串并返回日期,相等性检查失败
【发布时间】:2020-09-01 10:35:31
【问题描述】:

我已经编写了一些类编码解码例程到 json 并返回。这有效,除了一种明确的类型是 Date

没有显示完整的库,这是我的问题

Date now = Date.newInstance()
println "now : $now"
Date reconverted = new SimpleDateFormat('EEE MMM dd HH:mm:ss Z yyyy').parse(now.toString())
println "reconverted : $reconverted"

assert reconverted == now  //this assertion fails 

如果您查看两者的输出字符串文本,它们是相同的。但是'reconverted'对象不等于'now'对象。

这是由于 Date 中某处的精度丢失造成的吗?我假设重构后的值是相等的。

这只是一个问题,因为如果类有日期字段,我无法断言我的编码/解码类实例是相同的

我的 LocalDateTime 编码/解码没有这个问题,我的解码解析看起来像这样

LocalDateTime.parse (jsonStrValue) 

当我检查等价时工作正常

我错过了什么停止这个工作的日期?

【问题讨论】:

  • 你实际上已经截断了毫秒。
  • “这是由于 Date 中某处的精度丢失造成的吗?” 是的,原始日期值中的毫秒数已丢失。
  • 我建议你不要使用Date。该课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time APIInstant。即使没有任何显式格式化程序,它也会解析回一个相等的 Instant 对象。更多内容my answer here.
  • 顺便说一句,这种格式对于将日期时间值交换为文本是一个糟糕的选择。了解ISO 8601
  • java.util.Date 类多年前已被 java.time.Instant 取代。

标签: java groovy decode encode equality


【解决方案1】:

如 cmets 中所述,您的解析不包括毫秒。如果您对时间不感兴趣,可以使用一些 java.util.Date 扩展方法来获得可比较的结果。

def today = new Date().clearTime() // requires groovy-dateutil library for Groovy 2.5+
def parsed = Date.parse('EEE MMM dd HH:mm:ss Z yyyy', today.toString())
assert parsed == today

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2021-09-19
    • 2011-06-13
    相关资源
    最近更新 更多