两个日期之间的天数错误值
Wrong value of Days between two Dates
我正在计算两个日期之间的天数,但无法得到正确的结果。
我做了和别人描述的一样的事情。
我的结果应该是 int
或 long
。对于这个例子,我会 expext 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
}
private static long daysBetween(Date date1, Date date2){
return (date2.getTime() - date1.getTime()) / (60*60*24*1000);
}
java.util.Date
、Calendar
和 SimpleDateFormat
是可怕的 API 的一部分。他们使 date/time 处理工作变得比现在更难。
帮自己一个忙,使用一个像样的 date/time 库:https://github.com/JakeWharton/ThreeTenABP - here's a nice tutorial on how to use it -
有了这个API,做你想做的事就这么容易了:
LocalDate startDate = LocalDate.parse("2018-03-25");
LocalDate endDate = LocalDate.parse("2018-04-05");
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // 11
根据您的代码,我选择使用 LocalDate
:输入只有日、月和年,而您将 hour/minute/seconds 设置为零,所以我知道您不关心一天中的时间来计算差异 - 这使得 LocalDate
成为最佳选择。
Date
和 Calendar
表示特定时间点,Calendar
也使用时区,因此夏令时更改可能会影响结果,具体取决于设备的默认时区。使用 LocalDate
可以避免这个问题,因为这个 class 没有时区。
但是无论如何,我测试了你的代码,结果也是 11,所以不清楚你面临的问题。
我正在计算两个日期之间的天数,但无法得到正确的结果。 我做了和别人描述的一样的事情。
我的结果应该是 int
或 long
。对于这个例子,我会 expext 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
}
private static long daysBetween(Date date1, Date date2){
return (date2.getTime() - date1.getTime()) / (60*60*24*1000);
}
java.util.Date
、Calendar
和 SimpleDateFormat
是可怕的 API 的一部分。他们使 date/time 处理工作变得比现在更难。
帮自己一个忙,使用一个像样的 date/time 库:https://github.com/JakeWharton/ThreeTenABP - here's a nice tutorial on how to use it -
有了这个API,做你想做的事就这么容易了:
LocalDate startDate = LocalDate.parse("2018-03-25");
LocalDate endDate = LocalDate.parse("2018-04-05");
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // 11
根据您的代码,我选择使用 LocalDate
:输入只有日、月和年,而您将 hour/minute/seconds 设置为零,所以我知道您不关心一天中的时间来计算差异 - 这使得 LocalDate
成为最佳选择。
Date
和 Calendar
表示特定时间点,Calendar
也使用时区,因此夏令时更改可能会影响结果,具体取决于设备的默认时区。使用 LocalDate
可以避免这个问题,因为这个 class 没有时区。
但是无论如何,我测试了你的代码,结果也是 11,所以不清楚你面临的问题。