我有一个约会,我想看看那个日期是否距离今天还有/不到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;
}
答案 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);
}
答案 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)
查看该日期是否远离今天还是不到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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?