繁体   English   中英

在java中获得最大日期值的最佳方法?

[英]Best way to get maximum Date value in java?

我正在编写一些逻辑,要求将空日期视为未来永远的意思(所讨论的日期是到期日期,可能存在也可能不存在)。 我不想在整个代码中为空日期设置特殊情况,而是只想将空值转换为最大可能的日期。 如果没有硬编码,我看不到任何明显的方法来获得这样的值。 获得正在使用的任何 Date 实现的最大值的最佳方法是什么?

尝试

new Date(Long.MAX_VALUE)

这应该为您提供 Java 中可能的最长日期值。

在你自己的类中封装你想要的功能,使用 Long.MAX_VALUE 很可能会给你带来问题。

class ExpirationDate {
    Date expires;

    boolean hasExpiration() {
        return expires == null;
    }

    Date getExpirationDate() {
        return expires;
    } 

    boolean hasExpired(Date date) {
        if (expires == null) {
            return true;
        } else {
            return date.before(expires);
        }
    }

    ...
}

+1 对 Long.MAX_VALUE 建议。 如果您按日期字段对内容进行排序,这似乎会对您有所帮助。

但是,不要从需要日期的某个大常量值构建日期,而是使用全局可见的单例来保存代表您的特殊值的 Date 实例:

class DateUtil
{
  public static final Date NO_EXPIRE = new Date( Long.MAX_VALUE );
}

然后您可以使用简单的身份比较(mydate == DateUtils.NO_EXPIRE)来测试特定日期是否属于您的特殊情况,而不是 obj.equals(); (即 mydate.equals ( DateUtils.NO_EXPIRE ); )

这是我所做的:

public static final TimeZone UTC;

// 0001.01.01 12:00:00 AM +0000
public static final Date BEGINNING_OF_TIME;

// new Date(Long.MAX_VALUE) in UTC time zone
public static final Date END_OF_TIME;

static
{
    UTC = TimeZone.getTimeZone("UTC");
    final Calendar c = new GregorianCalendar(UTC);
    c.set(1, 0, 1, 0, 0, 0);
    c.set(Calendar.MILLISECOND, 0);
    BEGINNING_OF_TIME = c.getTime();
    c.setTime(new Date(Long.MAX_VALUE));
    END_OF_TIME = c.getTime();
}

请注意,如果时区不是 UTC,您将从“时间结束”获得偏移量,这不会是最大值。 这些对于插入到数据库字段中并且不必具有 NULL 日期特别有用。

您是否考虑过使用Joda Time

它计划包含在 Java 7 中作为JSR-310的基础

您可能感兴趣的功能是ZeroIsMaxDateTimeField ,它基本上将零字段交换为日期时间内该字段的最大值。

从 Java SE 8 开始,您可以使用:

LocalDate.MAX

我看到的一个问题是,对于按到期日期排序,使用 null 不容易排序。 因此,可能需要用实际值替换(即使它是未来很长一段时间内的任意哨兵值)。

我想另一种处理“无到期”的方法是简单地说某些东西在未来 100 年到期……除非您的数据库正在处理长期合同!

我喜欢 Instant.MAX,因为它在未来比 Long.MAX_VALUE 更有可能得到支持。

请注意,截至今天, Instant.MAX.toEpochMilli() 会引发溢出错误。

也许一种选择是使用最大系统日期。 您可以使用以下方法获取它:

System.out.println(new Date(Long.MAX_VALUE).toString())
//Output:
//Sun Aug 17 12:42:55 IST 292278994

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM