JodaTime中的最小/最大日期/日期时间[英] Min/Max Date/DateTime in JodaTime

问题描述

JodaTime 中是否有任何方法可以构造一个始终小于/大于任何其他 Date/DateTime 的 Date/DateTime?类似于

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

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

推荐答案

java.time

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

有关 java.time 中的最小值/最大值,请参阅我的答案,了解类似问题.

乔达时间

Joda-Time 跟踪时间作为 毫秒 自 1970 年第一刻的纪元 UTC.此计数使用 64 位 long 整数保持.因此,从技术上讲,最大值和最小值是 long 的 +/- 限制.

… new DateTime( Long.MIN_VALUE )
… new DateTime( Long.MAX_VALUE )

Joda-Time 没有可方便地用作常数的最小/最大值.相比之下,请注意 Joda-Time 的继任者 java.time 内置于 Java 8 及更高版本中,确实提供了常量 LocalDateTime.MINLocalDateTime.MAX.

顺便说一句,Joda-Time 团队建议我们应该迁移到 java.time.大部分 java.time 功能都向后移植到 Java 6 &7 在ThreeTen-Backport,进一步适配Android在ThreeTen-ABP.

太大,太小

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

例如,许多系统使用 UNIX &自 1970-01-01T00:00:00Z 以来,跟踪时间的 POSIX 为整秒的 32 位整数计数.+/- 20 亿秒的自然限制导致迫在眉睫的2038 年问题.

另一个限制是表单和报告中字段的物理显示大小,预计年份数字中只有四位数.

解决方法

您可以定义自己的最小值/最大值.

您可能需要极端值,例如 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( "END_OF_TIME: " + 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

本文地址:https://www.itbaoku.cn/post/978746.html