【问题标题】:Sorting by Date instead of day按日期而不是按天排序
【发布时间】:2018-04-26 05:07:01
【问题描述】:

如何按日期对事件进行排序,当我尝试时,它是按天排序,但不是按日期排序。

例如,如果我们在 01/02/2018、23/04/2018、01/06/2018 有三个事件,则当前结果排序如下,[01/02/2018,01/06/2018 ,2018 年 4 月 23 日]

谢谢!

【问题讨论】:

  • 你能在stackoverflow上写你的代码(在一个代码块中)而不是截图吗?
  • 我没有看到任何排序的尝试,为什么所有代码​​都在 XML 注释中 (<!--)?
  • 这在多个方面不清楚,抱歉。您能否create a Minimal, Complete, and Verifiable example 并通过示例指定精确的输入、精确的预期输出以及观察到的输出有何不同?
  • 我建议你不要使用CalendarTimeZoneDateSimpleDateFormat。这些课程都早已过时且设计不佳。而是使用java.time, the modern Java date and time API。使用起来更好。
  • order by eventFrom 是 SQL 查询或其他查询的一部分吗?数据库中eventFrom 的数据类型是什么?您使用的是什么 DBMS?

标签: java sorting date


【解决方案1】:

这可能是因为您的数据库中的eventFrom 列具有字符类型(例如varchar(10))。当您执行order by eventFrom 时,数据库正在对字符串进行排序,而不是您和我在字符串中看到的日期。这会首先按月份排序,因为它首先出现在您的字符串中,然后如果月份的日期相同,则按月份,最后按年份。所以01/02/2018 出现在01/06/2018 之前,因为它们有同一天,而02 出现在06 之前。

两个明显的修复是

  • 数据库列最好使用数据类型date。然后排序将按照您的预期按时间顺序排列。
  • 如果您的数据库不提供 date 数据类型(很可能确实如此),请将日期以字符串格式存储,首先是年份,然后是月份和月份中的某日。我建议您使用 ISO 8601 格式,因为这是一种广泛使用的标准,不太可能给您带来任何麻烦。然后您的日期将类似于2018-02-012018-04-232018-06-01,并且会按预期进行排序。

我在评论中提到您使用过时的日期和时间类。您需要的来自java.time 的现代Java 日期和时间API 的类是LocalDate。 “本地”表示没有时区,“日期”表示没有时间的日期,所以这比老式的DateCalendar 更适合。另一个非常好的事情是LocalDate.toString() 生成的正是我提到的 ISO 8601 格式。如果您无法避免字符串格式,这将很方便:您不需要任何显式格式化程序来生成数据库中使用的格式。 LocalDate.parse() 也将相同的格式解析回没有格式化程序的 LocalDate 对象。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多