java.time
Joda-Time 项目现在处于维护模式。团队建议迁移到 java.time 类。
对于 java.time 中的最小值/最大值,请参阅 my Answer 的类似问题。
乔达时间
Joda-Time 从UTC 中的 1970 年第一个时刻的纪元开始跟踪时间作为 milliseconds 的计数。此计数使用64-bit long 整数保持。因此,从技术上讲,最大值和最小值是 long 的 +/- 限制。
… new DateTime( Long.MIN_VALUE )
… new DateTime( Long.MAX_VALUE )
Joda-Time 没有可方便地用作常数的最小/最大值。相比之下,请注意 Joda-Time 的继任者 java.time 内置于 Java 8 及更高版本中,确实提供了常量 LocalDateTime.MIN 和 LocalDateTime.MAX。
顺便说一句,Joda-Time 团队建议我们应该迁移到 java.time。大部分 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,在 ThreeTen-ABP 中进一步适应 Android。
太大,太小
谨防这些极端情况。它们的使用并不实用。各种库、应用程序、数据库和其他日期时间值的接收器/源可能有很大不同的限制,有些大得多,但通常小得多。
例如,许多系统使用 UNIX 和 POSIX 的旧传统跟踪时间作为自 1970-01-01T00:00:00Z 以来整秒的 32 位整数计数。 +/- 20 亿秒的自然限制导致Year 2038 Problem 迫在眉睫。
另一个限制是表单和报告中字段的物理显示大小,预计年份数字只有四位数。
解决方法
您可以定义自己的最小值/最大值。
您可能需要极端值,例如 0000 年和 9999 年。Joda-Time 支持晚于 9,999 年,但我会坚持使用 4 位数字以适应屏幕和报告中显示的常用格式。从视觉上看,四个九是一个虚假的日期。
或者您可能需要适合您的业务逻辑的预期最小值。如果构建一个新的发票系统,那么您知道年份应该始终是今年或更晚。
我建议在帮助类上定义常量。像这样的:
package com.example;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class JodaTimeHelper {
static final public DateTime START_OF_TIME = new DateTime( 0000, 1, 1, 0, 0, 0, DateTimeZone.UTC );
static final public DateTime END_OF_TIME = new DateTime( 9999, 1, 1, 0, 0, 0, DateTimeZone.UTC );
static final public DateTime MINIMUM_INVOICE_DATETIME = new DateTime( 2015, 1, 1, 0, 0, 0, DateTimeZone.UTC );
}
这是调用这些常量的语法。
System.out.println( "START_OF_TIME: " + JodaTimeHelper.START_OF_TIME );
System.out.println( "END_OF_TIME: " + JodaTimeHelper.END_OF_TIME );
System.out.println( "MINIMUM_INVOICE_DATETIME: " + JodaTimeHelper. MINIMUM_INVOICE_DATETIME );
运行时。
START_OF_TIME: 0000-01-01T00:00:00.000Z
END_OF_TIME: 9999-01-01T00:00:00.000Z
MINIMUM_INVOICE_DATETIME: 2015-01-01T00:00:00.000Z