我正在编写一些逻辑,需要将空日期视为未来的永久(相关的日期是过期日期,可能存在也可能不存在)。我不想在代码中到处使用特殊情况以处理空日期,我只想将null转换为最大可能的日期。没有明显的方法可以获取这样的值而不硬编码。如何获取正在使用的任何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);
}
}
...
}
对于 Long.MAX_VALUE 的建议加 1。如果您按照日期字段排序,这似乎会对您有所帮助。
但是,不要在需要日期时从某些大常量值构造日期,而是使用全局可见的单例来保存表示您特殊值的 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();
}
From Java SE 8 you could use:
LocalDate.MAX
您是否考虑过采用Joda Time?它被定为Java 7的基础,作为JSR-310。
可能会引起您兴趣的功能是ZeroIsMaxDateTimeField,它基本上将日期时间中的零字段替换为该字段内的最大值。
我喜欢Instant.MAX,因为它比Long.MAX_VALUE更有可能在未来得到支持。
但需要注意的是,目前Instant.MAX.toEpochMilli()会抛出溢出错误。
我看到的一个问题是,在按到期日期排序时,使用null不容易进行排序。因此,可能需要用实际值(即使它是一个任意的哨兵值,远在未来)来替换。
我想,另一种处理“没有过期”方式就是简单地说某些东西将在100年后过期...除非你的数据库正在处理长期合同!
也许一个选项是使用最大系统日期。您可以通过使用以下方式获取它:
System.out.println(new Date(Long.MAX_VALUE).toString())
//Output:
//Sun Aug 17 12:42:55 IST 292278994
2666-01-01T00:00:00.0Z
。 - Basil Bourque