代码之家  ›  专栏  ›  技术社区  ›  jthg

在java中获取最大日期值的最佳方法?

  •  53
  • jthg  · 技术社区  · 16 年前

    7 回复  |  直到 16 年前
        1
  •  115
  •   Ivan Nevostruev    16 年前

    尝试

    new Date(Long.MAX_VALUE)
    

        2
  •  21
  •   Tom    16 年前

    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);
            }
        }
    
        ...
    }
    
        3
  •  7
  •   Trevor Harrison    16 年前

    +1到Long.MAX_值建议。如果您按日期字段对内容进行排序,这似乎会对您有所帮助。

    但是,不要在需要日期时从某个较大的常量值构建日期,而是使用全局可见的单例来保存表示特殊值的日期实例:

    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
  •  4
  •   user177800 user177800    16 年前

    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,您将得到“时间结束”的偏移量,这不是最大值。对于插入到数据库字段中并且不必有空日期,这些特别有用。

        5
  •  2
  •   crowne    16 年前

    Joda Time ?

    它将被包括在Java7中,作为 JSR-310

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

        6
  •  2
  •   tmucha    7 年前

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

    LocalDate.MAX
    
        7
  •  1
  •   Toybuilder    16 年前

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

        8
  •  0
  •   ccleve    6 年前

    我喜欢Instant.MAX,因为它比Long.MAX\u值更可能在将来得到支持。

    但是请注意,到今天为止,Instant.MAX.toEpochMilli()抛出了一个溢出错误。

        9
  •  -1
  •   Mika    11 年前

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

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