首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >小于或等于GregorianCalendar

问小于或等于GregorianCalendar
EN

Stack Overflow用户
提问于 2014-02-05 23:05:15
回答 5查看 2.1K关注 0票数 1

我的程序中有以下代码:

代码语言:javascript
复制
if (expire.after(start) && expire.before(end))
    //do somethig

但此代码不包括绑定日期。例如,如果开始时间是2014/01/15,结束时间是2014/01/20,过期时间是2014/01/20,则不考虑过期。如何解决?

我试过这样做:

代码语言:javascript
复制
if (expire.after(start) && (expire.equals(end) || expire.before(end)))

但是它不起作用,我得到了同样的结果。

EN

回答 5

Stack Overflow用户

发布于 2014-02-05 23:13:24

当我在过去做时间检查时,我总是只使用after和before,即使我的范围检查是start <= current <= end。

您可以通过调整开始日期和结束日期来实现这一点,使它们超出所需范围的范围。

例如,如果开始日期是2014/01/15,则使用开始日期值2014/01/14 23:59:59作为用于比较的实际开始日期。使用2014/01/21 00:00:00作为结束日期,而不是2014/01/20。对于这些值,您可以使用.after(startDate)和.before(endDate)。

下面是一些计算开始日期的代码:

代码语言:javascript
复制
    private static Date calculateStartDate(
        final int year,
        final int month,
        final int dayOfMonth)
    {
        Calendar calendar = Calendar.getInstance();
        Date returnValue;

        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        calendar.set(Calendar.HOUR, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);

        returnValue = calendar.getTime();

        return returnValue;
    }

上面添加了毫秒的编辑

票数 1
EN

Stack Overflow用户

发布于 2014-02-05 23:19:59

正如@assylias所说的,你可以尝试!expire.after(end),尽管这可能还不够。如果您使用expire.equals(end),那么您必须记住,这不仅仅是时间上的比较!在这里,您还可以比较时区信息,甚至区域设置等。通常,只使用GregorianCalendar进行日期比较并不好,因为这种类型也将毫秒作为时间部分。因此,您可能需要手动将所有三个日历实例的整个时间部分设置为零(午夜,忽略巴西某些日子的时区异常),或者更好,您应该提取日期信息,并使用以下工具比较这些详细信息:

代码语言:javascript
复制
public class DateComparator implements Comparator<GregorianCalendar> {
  public int compare(GregorianCalendar gcal1, GregorianCalendar gcal2) {
    int y1 = gcal1.get(Calendar.YEAR);
    int y2 = gcal2.get(Calendar.YEAR);
    if (y1 != y2) {
       return y1 - y2;
    }

    int m1 = gcal1.get(Calendar.MONTH);
    int m2 = gcal2.get(Calendar.MONTH);
    if (m1 != m2) {
       return m1 - m2;
    }
    return gcal1.get(Calendar.DATE) - gcal2.get(Calendar.DATE);
  }
}

但是,在比较日期部分时,请确保始终使用相同的时区。或者,您可以尝试JodaTime,它提供了LocalDate类型。类似的仅日期类型也包含在新的Java 8中。

票数 1
EN

Stack Overflow用户

发布于 2014-02-05 23:15:35

或

代码语言:javascript
复制
if ((expire.compareTo(start) >= 0) && (expire.compareTo(end) <= 0))

因为

http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#after(java.lang.Object)

表示.before等于compareTo(when) <0,.after等于compareTo(when) >0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21580841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档