如何创建或设置具有最大值的 JodaTime DateTime 对象?

Posted

技术标签:

【中文标题】如何创建或设置具有最大值的 JodaTime DateTime 对象?【英文标题】:How can I create or set JodaTime DateTime objects with/to maximum value? 【发布时间】:2014-05-30 23:38:24 【问题描述】:

我正在将一些 C# 代码翻译成 Java,并选择了 JodaTimeDateTime 类来替换 C#System.DateTime

C# 中,DateTime 类有一个名为MaxValue 的字段和一个名为MinValue 的字段,它返回DateTime 对象可以保存的最大和最小可能值。

我正在尝试使用JodaTime api 来实现相同的目标。我已经阅读了其他帖子的一些建议

这个:Java equivalent of .NET DateTime.MinValue, DateTime.Today 回答了如何在JodaTime 中设置今天的日期,但是在回答问题的后半部分时,关于最小值,他们转向CalendarDate

同样,我也看到了有关将最大化的 long 值作为构造函数参数传递的建议,但它被批评为依赖于将来可能会更改的类,因此在 API 更新后可能不兼容或不准确。

那么,有没有一种完全正确的方法可以做到这一点?如果没有,有没有好的方法来实现这一点?

【问题讨论】:

【参考方案1】:

Java 8 LocalDate 有两个值。 LocalDate.MAX 和 LocalDate.MIN

LocalDate.MAX - 支持的最大 LocalDate,'+999999999-12-31'。这可以被应用程序用作“遥远的未来”日期。

LocalDate.MIN - 支持的最小 LocalDate,'-999999999-01-01'。这可以被应用程序用作“远过去”的日期。

注意:这些不会转换为 Long.MIN_VALUE 或 Long.MAX_VALUE。


如果从 C# 迁移以及日期/时间的工作方式对您很重要,我建议使用 Java 8,因为它具有闭包和基于 JodaTime 的新 DateTime API。如果您担心 API 的未来,您应该使用这个新的 DateTime API。

我认为您可以假设 Long.MIN_VALUE 和 Long.MAX_VALUE 永远不会改变,因为它们基于有符号 64 位值如何工作的定义。 (很可能,在您出生之前,64 位值的工作方式是标准化的)您也可以假设 Date 不会改变,因为它自发布以来并没有太大变化,而且由于它已被替换,因此更没有理由改变它。理论上它可能会被弃用,但实际上仍然有太多代码在使用它。

恕我直言,我使用 long 表示 System.currentTimeMillis() 以毫秒为单位的时间,我使用 Long.MIN_VALUE 和 Long.MAX_VALUE。

如果您担心使用良好的 API 和将来验证您的代码,我建议您避免使用日历。并不是说这一切都不好,但有充分的理由想要更换它。

【讨论】:

我认为你是对的。在我读到可能存在一些问题后,我想要第二个意见。让我测试一下它是否真的适用于 Long.MIN_VALUE。我有点假设 0 将是正确的做法,但那是 1970 年,对,而不是真正的最小值。我会确保它有效;) @KjetilNordin 0 如果您可以假设在 1970 年左右或之前没有日期,则可以。例如如果您的日期仅限于过去十年或当前时间。 @KjetilNordin 我已经更新了我的答案。我想这就是你最初想要的。 看起来不错。我还没有升级到 Java 8。其实我没有意识到它已经被释放了。由于兼容性问题,我在这里工作的最后一个项目必须从 7 降级到 6,但我喜欢你的答案现在既适用于我的需求,又适用于下一代的最佳实践。谢谢。

以上是关于如何创建或设置具有最大值的 JodaTime DateTime 对象?的主要内容,如果未能解决你的问题,请参考以下文章

Joda Time 将时区日期时间转换为毫秒

使用 ObjectMapper 为 JodaTime 设置时区偏移的 Jackson DateTime 格式

JodaTime 夏令时错误

jodatime DateTime 对象和语言环境

如何选择最大的视图值? [关闭]

Java - 使用DBUtils BeanListHandler将查询中的所有日期转换为JodaTime的DateTime