我试图计算两个日期之间的日子,但我无法得到正确的结果。 我做了同样有人向我描述的事情。
我的结果应该是int
或long
。对于这个例子,我将exxt 11,但10也没关系。
代码:
String startDate = "2018-03-25";
String endDate = "2018-04-05";
Date startDate1 = stringToDate(startDate);
Date endDate1 = stringToDate(endDate);
long ab = daysBetween(startDate1, endDate1);
String ab1 = String.valueOf(ab);
这就是方法:
public static long daysBetween(Date startDate, Date endDate) {
Calendar sDate = getDatePart(startDate);
Calendar eDate = getDatePart(endDate);
long daysBetween = 0;
while (sDate.before(eDate)) {
sDate.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
return daysBetween;
}
public Date stringToDate(String stringDatum) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(stringDatum);
return date;
}
catch (ParseException e) {
e.printStackTrace();
}
return null;
}
public static Calendar getDatePart(Date date){
Calendar cal = Calendar.getInstance(); // get calendar instance
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0); // set hour to midnight
cal.set(Calendar.MINUTE, 0); // set minute in hour
cal.set(Calendar.SECOND, 0); // set second in minute
cal.set(Calendar.MILLISECOND, 0); // set millisecond in second
return cal; // return the date part
}
答案 0 :(得分:4)
java.util.Date
,Calendar
和SimpleDateFormat
是可怕API的一部分。他们使日期/时间处理的工作比现在更难。
帮自己一个忙,并使用一个不错的日期/时间库:https://github.com/JakeWharton/ThreeTenABP - 这是一个关于如何使用它的好教程 - How to use ThreeTenABP in Android Project
使用此API,您可以轻松完成所需的操作:
LocalDate startDate = LocalDate.parse("2018-03-25");
LocalDate endDate = LocalDate.parse("2018-04-05");
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // 11
我已根据您的代码选择使用LocalDate
:输入只有日,月和年,并且您将小时/分钟/秒设置为零,所以我理解你不在乎计算差异的时间 - 这使LocalDate
成为最佳选择。
Date
和Calendar
代表特定时间点,Calendar
也使用时区,因此夏令时更改可能会影响结果,具体取决于设备的默认设置时区。使用LocalDate
可以避免此问题,因为此类没有时区。
但无论如何,我已经测试了你的代码,结果也得到了11,所以不清楚你面临的问题。
答案 1 :(得分:-1)
private static long daysBetween(Date date1, Date date2){
return (date2.getTime() - date1.getTime()) / (60*60*24*1000);
}