Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JodaTime中的最小/最大日期/日期时间_Java_Jodatime - Fatal编程技术网

Java JodaTime中的最小/最大日期/日期时间

Java JodaTime中的最小/最大日期/日期时间,java,jodatime,Java,Jodatime,JodaTime中是否有任何方法可以构造一个总是比任何其他日期/日期时间小/大的日期/日期时间?类似于 DateTime bigBang = DateTime.xxx(); DateTime endOfUniverse = DateTime.yyy(); 约束:我不想使用标准Java日期库。当所有日期都在同一时区内时,您可以创建DateTime对象,并将字段指定为最小值或最大值。 但是,当使用此构造函数时 DateTime(int year, int monthOfYear, int dayO

JodaTime中是否有任何方法可以构造一个总是比任何其他日期/日期时间小/大的日期/日期时间?类似于

DateTime bigBang = DateTime.xxx();
DateTime endOfUniverse = DateTime.yyy();

约束:我不想使用标准Java日期库。

当所有日期都在同一时区内时,您可以创建
DateTime
对象,并将字段指定为最小值或最大值。
但是,当使用此构造函数时

DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute)
对于
Years.MAX\u VALUE.getYears()
我有以下例外:

因此,使用从异常开始的最大年数,我得出了以下宇宙结束日期时间:

DateTime dtMax = new DateTime(292278993, 12, 31, 23, 59, 59);
System.out.println(dtMax);
// prints 292278993-12-31T23:59:59
有关详细信息,请参阅。
还可以阅读有趣的讨论。

java.time Joda Time项目现在处于维护模式。团队建议迁移到java.time类

有关java.time中的最小值/最大值,请参阅关于类似问题的

乔达时间 从1970年的第一个时刻开始,将时间作为计数进行跟踪。使用
long
整数保存此计数。因此,从技术上讲,最大值和最小值是
long
的+/-极限

… new DateTime( Long.MIN_VALUE )
… new DateTime( Long.MAX_VALUE )
Joda Time没有常数这样的最小值/最大值。相反,请注意Joda Time的后继版本,内置于Java8和更高版本中,确实提供了常量和

顺便说一下,Joda Time团队建议我们应该迁移到java.Time。大部分java.time功能在中被向后移植到java 6和7,并在中进一步适应Android

太大,太小 小心这些极端情况。它们的使用是不实际的。各种库、应用程序、数据库和日期时间值的其他接收器/源可能有很多不同的限制,有些更大,但通常更小

例如,自1970-01-01T00:00:00Z以来,许多系统使用UNIX和POSIX的旧传统,将跟踪时间作为整秒的32位整数计数。+/-20亿秒的自然极限会导致出现这种情况

另一个限制是表单和报表上字段的物理显示大小,这些字段在一个年号中只能显示四位数字

变通办法 您可以定义自己的最小/最大值

您可能需要诸如0000年和9999年之类的极值。Joda Time支持比9999晚几年,但我会坚持使用4位数字,以适应屏幕和报告中常用的显示格式。从视觉上看,“四九”是一个虚假的日期

或者,您可能需要适合您的业务逻辑的预期最小值。如果建立一个新的发票系统,那么您知道年份应该总是今年或以后

我建议在助手类上定义常量。大概是这样的:

package.com.example;
导入org.joda.time.DateTime;
导入org.joda.time.DateTimeZone;
公共类JodaTimeHelper{
静态最终公共日期时间开始时间=新日期时间(0000,1,1,0,0,0,DateTimeZone.UTC);
静态最终公共日期时间结束时间=新的日期时间(9999,1,1,0,0,0,DateTimeZone.UTC);
静态最终公共日期时间最小值\u发票\u日期时间=新日期时间(2015,1,1,0,0,DateTimeZone.UTC);
}
下面是调用这些常量的语法

System.out.println(“起始时间:+JodaTimeHelper.START起始时间”);
System.out.println(“结束时间:+JodaTimeHelper.END结束时间”);
System.out.println(“最小发票日期时间:+JodaTimeHelper.MINIMUM发票日期时间”);
跑步的时候

开始时间:0000-01-01T00:00:00.000Z
结束时间:9999-01-01T00:00:00.000Z
最低发票日期时间:2015-01-01T00:00:00.000Z

在阅读了大量不同的相关内容后,我最终决定找出一个适用于UTC时区最小值和最大值的最小情况。结果证明,试图使用
Long
minu值
MAX\u值
会让我陷入兔子的陷阱

因此,给出以下代码片段:

new DateTime(milliseconds, DateTimeZone.UTC)
以下是在
毫秒内工作的最小/最大值(在Java 1.7中测试):


这两个值距离
Long.MIN\u值
Long.MAX\u值
大约有200亿。我认为
new DateTime(0)
将为您提供可以表示的最小
DateTime
。这只是一个粗略的猜测,但是
long
的最大值可能是最大值?对于Java 8,它只是(分别是最小值)@TheodorosChatzigiannakis 0将给出01/01/1970。你肯定可以在过去用负值更进一步。但是,最小值和最大值不是DateTime的有效值。他们暂时没问题。这是不可能做到的。。。因为如果你有最大的datetime,它将始终与最大的datetime相同。。自相矛盾lol。除非你的意思是
比任何其他日期/日期时间都小/大,除了它本身
IMO,否则Joda不应该这样使用。我找到了一个方法
BasicChronology.getMaxYears()
,但这是一个包方法。这取决于所使用的时间顺序。在科普年代学中,最大年份为292272708。上面的例子中使用了等时法。只需补充说明,JodaTime支持的极端最小/最大日期为:new DateTime(Long.min_值);新日期时间(长最大值);
UTC_DATE_TIME_MIN_VALUE_IN_MILLIS = 9223372017129599999L
UTC_DATE_TIME_MAX_VALUE_IN_MILLIS = -9223372017043200000L