[英]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.