在java中获取最大Date值的最佳方法是什么?

时间:2009-11-16 18:31:23

标签: java datetime

我正在编写一些逻辑,要求将空日期永久地视为永久意义(有关日期是过期日期,可能存在也可能不存在)。我希望只将null转换为最大可能的Date,而不是在整个代码中为null日期添加特殊情况。我没有看到任何明显的方法来获得这样的价值而不用硬编码。什么是获得使用Date实现的最大值的最佳方法?

9 个答案:

答案 0 :(得分:101)

尝试

new Date(Long.MAX_VALUE)

它应该为您提供Java中最长的日期值。

答案 1 :(得分:19)

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

    ...
}

答案 2 :(得分:6)

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

答案 3 :(得分:4)

以下是我的工作:

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 :(得分:2)

您是否考虑过使用Joda Time

它将作为JSR-310

的基础包含在java 7中

您可能感兴趣的功能是ZeroIsMaxDateTimeField 它基本上将零字段换成日期时间内该字段的最大值。

答案 5 :(得分:1)

我看到的一个问题是,对于到期日期的排序,使用null不容易排序。因此,可能需要用实际值替换(即使它是未来的任意哨兵值)。

我认为另一种对待“没有过期”的方法就是说将来100年后会有事......除非你的数据库处理长期合同!

答案 6 :(得分:1)

在Java SE 8中,您可以使用:

LocalDate.MAX

答案 7 :(得分:0)

我喜欢Instant.MAX,因为与Long.MAX_VALUE相比,将来更可能支持它。

请注意,从今天开始,Instant.MAX.toEpochMilli()会引发溢出错误。

答案 8 :(得分:-1)

也许一种选择是使用最大系统日期。您可以使用以下方式获取它:

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