Лучший способ получить максимальное значение даты в Java?


Я пишу немного логики, которая требует рассматривать нулевые даты как значение навсегда в будущем (дата, о которой идет речь, - это дата истечения срока действия, которая может или не может существовать). Вместо того, чтобы помещать специальные случаи для нулевой даты во всем коде, я хочу просто преобразовать null в максимально возможную дату. Я не вижу никаких очевидных способов получить такое значение без жесткого кодирования. Каков наилучший способ получить максимальное значение любой используемой реализации даты?

7 51

7 ответов:

попробовать

new Date(Long.MAX_VALUE)

который должен дать вам самое длинное возможное значение даты в Java.

Инкапсулируйте функциональность, которую вы хотите в своем собственном классе, используя Long.Массив скорее всего, вызовет у вас трудностей.

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 к длинным.Предложения массив. Кажется, что это поможет вам, если вы отсортируете материал по полю даты.

однако вместо того, чтобы строить дату из некоторого большого постоянного значения, где бы вам ни понадобилась дата, используйте глобально видимый синглтон для хранения экземпляра даты, представляющего ваше специальное значение:

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

затем вы можете использовать простое сравнение идентификаторов (mydate == DateUtils.NO_EXPIRE), чтобы проверить, является ли конкретная дата вашим особым случаем вместо возражений.равно (); (т. е. mydate.равно (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, вы получите смещения от "конца времени", которые не будут максимальными значениями. Они особенно полезны для вставки в поля базы данных и не должны иметь нулевые даты.

вы рассматривали использование Джода Времени?

Это планируется включить в java 7 в качестве основы для JSR-310

функция, которая может вас заинтересовать ZeroIsMaxDateTimeField который в основном меняет нулевые поля на максимальное значение для этого поля в течение даты-времени.

одна проблема, которую я вижу, заключается в том, что для сортировки по дате истечения срока действия использование null не легко сортируется. Поэтому может потребоваться замена на фактическое значение (даже если это произвольное значение sentry в будущем).

Я полагаю, что другой способ лечения "без истечения срока действия" - просто сказать, что что-то истекает через 100 лет в будущем... Если ваша база данных имеет дело с долгосрочными контрактами!

возможно, один из вариантов-использовать максимальную системную дату. Вы можете получить его с помощью:

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