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

我正在写一些逻辑,要求在将来(有问题的date是过期date,可能存在也可能不存在)将空date视为永远的意思。 而不是在整个代码中放置一个空date的特殊情况,我只想将null转换为最大可能的Date。 我没有看到任何明显的方式来获得这样的价值,没有硬编码。 什么是最好的方式来获得任何date实现正在使用的最大值?

尝试

 new Date(Long.MAX_VALUE) 

这应该给你在Java中最长的date值。

在你自己的类中封装你想要的function,使用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_VALUEbuild议+1。 看起来,如果按date字段sorting,这可以帮助你。

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

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

然后你可以使用简单的标识比较(mydate == DateUtils.NO_EXPIRE)来testing一个特定的date是否是你的特殊情况而不是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(); } 

请注意,如果TimeZone不是UTC,则会从“结束时间”获得偏移量,这不会是最大值。 这些对于插入数据库字段而不必具有空date是特别有用的。

你有没有考虑过使用乔达时间 ?

它将被包含在Java 7中作为JSR-310的基础

您可能会感兴趣的function是ZeroIsMaxDateTimeField ,它基本上在零date时间内将该字段的最大值换成零字段。

我看到的一个问题是,在过期datesorting,使用null不容易sorting。 因此,可能需要用一个实际的价值取代(即使这是一个任意的哨兵价值)。

我认为另一种对待“不过期”的方式就是说将来会有100年的时间到期……除非你的数据库正在处理长期合同!

也许有一个select是使用最大系统date。 你可以通过使用:

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