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