检查两个日期之间的差异是否超过一年 - Java

时间:2016-05-11 11:39:35

标签: java android date

我有一个约会,我想看看那个日期是否距离今天还有/不到1年。例如,日期是2017年5月13日,它将返回true,如果它是2018年5月13日,它将返回false。

我的代码中的错误是它将在2014年12月返回true(应返回false)。

有什么想法吗?

private boolean checkIfDateIsInRange() {
        Calendar today = DateTimeHelper.dateToCalendar(new Date());
        if (currentDate.get(Calendar.YEAR) > today.get(Calendar.YEAR) + 1 || currentDate.get(Calendar.YEAR) < today.get(Calendar.YEAR) - 1){
            return false;
        }
        return true;
    } 

dateToCalendar方法如下:

public static Calendar dateToCalendar(Date date){
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return cal;
}

7 个答案:

答案 0 :(得分:2)

我建议您使用Joda Times,然后找到Years Between

public static Years yearsBetween(ReadableInstant start,
                                 ReadableInstant end)

答案 1 :(得分:1)

您可以这样做:

if(TimeUnit.MILLISECONDS.toDays((long)Math.abs(today.getTimeInMillis() - currentDate.getTimeInMillis())) >= 365){
    // Is one or more years after or before.
}

如果您想考虑闰年,可以这样做:

final GregorianCalendar gc = new GregorianCalendar();
public boolean moreTheOneYearDifference(Calendar c1, Calendar c2){
    int days = 365;
    if (c1.before(c2) && gc.isLeapYear(c1.get(Calendar.YEAR))) {
        days += 1;
    } else if (gc.isLeapYear(c2.get(Calendar.YEAR))) {
        days += 1;
    }
    return TimeUnit.MICROSECONDS.toDays((long)Math.abs(c1.getTimeInMillis() - c2.getTimeInMillis())) >= days
}

答案 2 :(得分:0)

您的解决方案只是检查日期的年份部分是否与1相比有更大的差异,这当然会对2015-1-1和2016-12-31等值产生错误的结果。

我建议在两个日期的较低位置添加一年(在克隆它之后),然后检查它是否仍然在更晚的日期之前,在这种情况下差异超过一年。

public static boolean isMoreThanAYearDifference(Calendar c1, Calendar c2) {
    final Calendar earlierDate;
    final Calendar laterDate;
    if(c1.before(c2)) {
        earlierDate = (Calendar) c1.clone();
        laterDate = c2;
    } else {
        earlierDate = (Calendar) c2.clone();
        laterDate = c1;
    }

    earlierDate.add(Calendar.YEAR, 1);
    return earlierDate.before(laterDate);
}

答案 3 :(得分:0)

鉴于today是实际日期的日历,而dateInQuestion是要检查日期的日历:

Calendar oneYearPlus  = (today.clone()).add(Calendar.YEAR,1);
Calendar oneYearAgo   = (today.clone()).add(Calendar.YEAR,-1);
return oneYearPlus.after(dateInQuestion) || oneYearAgo.before(dateInQuestion);

答案 4 :(得分:0)

只需添加另一种方法:

public boolean checkIfInRange(Date date){

    Calendar cal= Calendar.getInstance();

    cal.add(Calendar.YEAR, -1);
    Date yearBeforeToday = cal.getTime();
    cal.add(Calendar.YEAR, 2);
    Date yearAfterToday = cal.getTime();

    return date.after(yearBeforeToday) && date.before(yearAfterToday);
}

Try it online!

答案 5 :(得分:0)

我有同样的需求并找到官方的jdk答案。它提供了使用期间进行此类日期检查的指示:

我发现这些功能非常有用!

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

int numYear = 1;
//checking if the period is more than the specified number of years (last parameter)
if(checkForPeriodLimit(sdf.parse("12/04/1977"), sdf.parse("11/04/1978"), numYear)){
     System.out.println("less than"+numYear+" year ago");
} else {
    System.out.println("more than"+numYear+" year ago");
}

//period checking function
public boolean checkForPeriodLimit(Date dateFrom, Date dateTo, int periodInYear){

    Period p = Period.between(dateFrom.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
            dateTo.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());

    return ((p.getYears() < periodInYear)?true:false);
}

打印结果:

**less than 1 years ago**

答案 6 :(得分:0)

TL;博士

  

查看该日期是否远离今天还是不到1年

使用LocalDate.isAfter进行比较。

LocalDate.of( 2020 , Month.JANUARY , 23 ).isAfter(
    LocalDate.now().plusYears( 1 )  // Better to pass an explicit time zone than rely on the JVM’s current default: LocalDate.now( ZoneId.of( “Pacific/Auckland” ) )
)

详细

现代方法使用 java.time 类。对于早期的Android,请参阅后端项目 ThreeTenABP

确定今天的日期需要一个时区。对于任何特定时刻,日期在全球范围内因地区而异。例如,今天在巴黎法国清晨在魁北克蒙特利尔仍然是“昨天”。

ZoneId z = ZoneId.of( “Africa/Tunis” ) ;

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate today = LocalDate.now( z ) ;

计算未来一年。

LocalDate yearFromToday = today.plusYears( 1 ) ;

实例化您的日期。

LocalDate x = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;

比较

Boolean isOverYearInFuture = x.isAfter( yearFromToday ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?