Лучший способ получить максимальное значение даты в Java? - PullRequest
55 голосов
/ 16 ноября 2009

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

Ответы [ 7 ]

102 голосов
/ 16 ноября 2009

Попробуйте

new Date(Long.MAX_VALUE)

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

19 голосов
/ 16 ноября 2009

Инкапсулируйте функциональность, которую вы хотите в своем собственном классе, использование 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);
        }
    }

    ...
}
6 голосов
/ 16 ноября 2009

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

4 голосов
/ 16 ноября 2009

Вот что я делаю:

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, вы получите смещения от «конца времени», которые не будут максимальными значениями. Они особенно полезны для вставки в поля базы данных и не должны иметь нулевые даты.

2 голосов
/ 16 ноября 2009

рассматривали ли вы возможность использования Joda Time ?

Он должен быть включен в Java 7 в качестве основы для JSR-310

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

1 голос
/ 22 сентября 2010

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

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

0 голосов
/ 29 мая 2015

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

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