我正在编写一些逻辑,要求将空日期永久地视为永久意义(有关日期是过期日期,可能存在也可能不存在)。我希望只将null转换为最大可能的Date,而不是在整个代码中为null日期添加特殊情况。我没有看到任何明显的方法来获得这样的价值而不用硬编码。什么是获得使用Date实现的最大值的最佳方法?
答案 0 :(得分:101)
尝试
new Date(Long.MAX_VALUE)
它应该为您提供Java中最长的日期值。
答案 1 :(得分:19)
使用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);
}
}
...
}
答案 2 :(得分:6)
+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);)
答案 3 :(得分:4)
以下是我的工作:
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();
}
请注意,如果TimeZone不是UTC,您将从“结束时间”获得偏移,这将不是最大值。这些对于插入数据库字段特别有用,而且不必具有NULL日期。
答案 4 :(得分:2)
您是否考虑过使用Joda Time?
它将作为JSR-310
的基础包含在java 7中您可能感兴趣的功能是ZeroIsMaxDateTimeField 它基本上将零字段换成日期时间内该字段的最大值。
答案 5 :(得分:1)
我看到的一个问题是,对于到期日期的排序,使用null不容易排序。因此,可能需要用实际值替换(即使它是未来的任意哨兵值)。
我认为另一种对待“没有过期”的方法就是说将来100年后会有事......除非你的数据库处理长期合同!
答案 6 :(得分:1)
在Java SE 8中,您可以使用:
LocalDate.MAX
答案 7 :(得分:0)
我喜欢Instant.MAX,因为与Long.MAX_VALUE相比,将来更可能支持它。
请注意,从今天开始,Instant.MAX.toEpochMilli()会引发溢出错误。
答案 8 :(得分:-1)
也许一种选择是使用最大系统日期。您可以使用以下方式获取它:
System.out.println(new Date(Long.MAX_VALUE).toString())
//Output:
//Sun Aug 17 12:42:55 IST 292278994