it-swarm-ja.tech

Javaで最大の日付値を取得する最良の方法は?

ヌルの日付を将来の永遠の意味として扱うことを要求するロジックを書いています(問題の日付は有効期限であり、存在しない場合もあります)。コード全体でnullの日付に特別なケースを置く代わりに、nullを可能な限り最大の日付に変換したいだけです。ハードコーディングせずにそのような値を取得する明白な方法は見当たりません。使用されているDate実装の最大値を取得する最良の方法は何ですか?

56
jthg

試して

new Date(Long.MAX_VALUE)

これにより、Javaで可能な限り長い日付値が得られます。

104
cjstehno

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);
        }
    }

    ...
}
19
Tom

Long.MAX_VALUE提案への+1。これは、日付フィールドでソートする場合に役立つと思われます。

ただし、日付が必要な場合に大きな定数値から日付を作成する代わりに、グローバルに表示されるシングルトンを使用して、特別な値を表すDateインスタンスを保持します。

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

次に、単純なID比較(mydate == DateUtils.NO_EXPIRE)を使用して、特定の日付がobj.equals()の代わりに特別なケースであるかどうかをテストできます。 (すなわちmydate.equals(DateUtils.NO_EXPIRE);)

6
Trevor Harrison

ここに私がやることがあります:

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
user177800

Joda Time の使用を検討しましたか?

JSR-31 の基礎としてJava 7に含まれる予定です。

興味のある機能は ZeroIsMaxDateTimeField です。これは、基本的に、date-time内のそのフィールドの最大値とゼロフィールドを交換します。

2
crowne

Java SE 8を使用できます:

LocalDate.MAX
1
tmucha

私が見る問題の1つは、有効期限でソートする場合、nullを使用することは簡単にソートできないことです。そのため、実際の値に置き換える必要があります(将来の任意の歩sent値であっても)。

「有効期限なし」を処理する別の方法は、単に100年後に有効期限が切れるということです...データベースが長期契約を扱っている場合を除きます!

1
Toybuilder