簡體   English   中英

在java中獲得最大日期值的最佳方法?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM