Nice programing

Java에서 최대 날짜 값을 얻는 가장 좋은 방법은 무엇입니까?

nicepro 2020. 12. 28. 22:34
반응형

Java에서 최대 날짜 값을 얻는 가장 좋은 방법은 무엇입니까?


나는 null 날짜를 미래에 영원히 의미하는 것으로 취급해야하는 약간의 논리를 작성하고 있습니다 (문제의 날짜는 존재하거나 없을 수있는 만료 날짜입니다). 코드 전체에 null 날짜에 대한 특별한 경우를 넣는 대신 null을 가능한 최대 날짜로 변환하고 싶습니다. 나는 그것을 하드 코딩하지 않고 그러한 가치를 얻는 명백한 방법을 보지 못합니다. 사용중인 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);
        }
    }

    ...
}

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


내가하는 일은 다음과 같습니다.

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 날짜를 가질 필요가 없습니다.


Joda Time 사용을 고려해 보셨습니까 ?

JSR-310 의 기반으로 Java 7에 포함될 예정입니다.

The feature that may interest you is ZeroIsMaxDateTimeField which basically swaps zero fields for the maximum value for that field within the date-time.


One problem I see is that for sorting on expiration date, using a null isn't easily sortable. So replacing with an actual value (even if it's an arbitrary sentry value well into the future) may be needed.

I suppose another way of treating "no expiration" is simply to say something expires 100 years in the future... Unless your database is dealing with long-term contracts!


From Java SE 8 you could use:

LocalDate.MAX

Perhaps one option is to use the maximal system date. You can get it by using:

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

ReferenceURL : https://stackoverflow.com/questions/1743985/best-way-to-get-maximum-date-value-in-java

반응형