我需要计算两个日期之间的天数,我使用下面的代码。问题是它返回我2但实际上它应该返回3因为2016年6月30日到6月27日之间的差异是3.你能帮助它应该包括当前日期以及差异吗?
public static long getNoOfDaysBtwnDates(String expiryDate) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date expDate = null;
long diff = 0;
long noOfDays = 0;
try {
expDate = formatter.parse(expiryDate);
//logger.info("Expiry Date is " + expDate);
// logger.info(formatter.format(expDate));
Date createdDate = new Date();
diff = expDate.getTime() - createdDate.getTime();
noOfDays = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
long a = TimeUnit.DAYS.toDays(noOfDays);
// logger.info("No of Day after difference are - " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
System.out.println(a);
System.out.println(noOfDays);
} catch (ParseException e) {
e.printStackTrace();
}
return noOfDays;
}
到期日为2016-06-30,当前日期为2016-06-27
答案 0 :(得分:7)
原因是,您没有使用相同的时间格式减去两个日期。
使用日历类将两个日期的时间更改为00:00:00,您将获得几天的确切差异。
UITableView
Jim Garrison的更多解释' answer
答案 1 :(得分:5)
为什么不使用LocalDate
?
import java.time.LocalDate;
import static java.time.temporal.ChronoUnit.DAYS;
long diffInDays(LocalDate a, LocalDate b) {
return DAYS.between(a, b);
}
答案 2 :(得分:3)
问题在于
Date createdDate = new Date();
将createdDate
设置为当前时刻,也就是说,它包含当前时间和日期。使用给定格式解析字符串时,时间初始化为00:00:00
。
假设您在当地时间恰好是18:00运行,最后以
结束createdDate = 2016-06-27 18:00:00.000
expDate = 2016-06-30 00:00:00.000
差异是2天6小时,而不是3天。
您应该使用Java 8中较新的java.time.*
类。有一个类LocalDate
表示没有时间的日期。它包括使用格式进行解析的方法,以及LocalDate.now()
获取当前日期的方法,以及计算LocalDate
个实例之间间隔的方法。
答案 3 :(得分:-1)
使用python指出的Calendar.get(Calendar.DAY_OF_MONTH)
:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date expDate = null;
String expiryDate ="2016-06-30";
int diff = 0;
try {
expDate = formatter.parse(expiryDate);
//logger.info("Expiry Date is " + expDate);
// logger.info(formatter.format(expDate));
Calendar cal = Calendar.getInstance();
int today = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(expDate);
diff = cal.get(Calendar.DAY_OF_MONTH)- today;
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(diff);