我对编码还很陌生,所以这可能是一个愚蠢的问题,但是我找不到任何解决方案。我想计算日期之间的差异(以天为单位)。它在大多数时间都有效,但是当月份改变时,我会得到奇怪的解决方案。
第一个示例:
今天-2018年9月30日= 78天,
今天-2018年9月31日= 79天(??),
今天- 2018年10月1日= 80天
第二个例子:
今天-2018年8月31日= 49天,
今天-2018年9月1日= 49天
代码
private static int[] abstandTage(GregorianCalendar date1, ArrayList<GregorianCalendar> csvDate)
{
int[] abstand = new int[csvDate.size()];
int i = 0;
while ( i < csvDate.size() )
{
long diffInMillis = csvDate.get(i).getTimeInMillis() - date1.getTimeInMillis();
long tage = diffInMillis / 1000 / 60 / 60 / 24;
abstand[i] = (int) tage;
i++ ;
}
return abstand;
}
date1是预定义的Date,csvDate是带有日期的列表。有人可以帮我吗?
预先感谢 亚历克斯
答案 0 :(得分:1)
可以使用ChronoUnit
计算差异数组。您还可以使用流进一步简化实现:
private static int[] abstandTage(GregorianCalendar date1,
ArrayList<GregorianCalendar> csvDate) {
return csvDate.stream()
.mapToInt(csvdate -> (int)
ChronoUnit.DAYS.between(date1.toZonedDateTime(), csvdate.toZonedDateTime()))
.toArray();
}
答案 1 :(得分:1)
如果您创建GregorianCalendar
对象,例如7月13日的new GregorianCalendar(2018, 7, 13)
,则会发生这种情况。GregorianCalendar
使用了一个怪异的月份编号,因此您没有得到7月13日。
解决方案是扔掉那些早已过时且设计不佳的课程,并使用LocalDate.of(2018, 7, 13)
甚至更好的LocalDate.of(2018, Month.JULY, 13)
创建日期。然后使用ChronoUnit.DAYS.between
查找日期之间的天数。
链接: Oracle tutorial: Date Time解释了如何使用现代Java日期和时间API java.time
。
答案 2 :(得分:0)
如上所述,您将必须在此处使用 LocalDate :
SimpleDateformat sdf = new SimpleDateFormat("yyyyMMdd");
Date date1 = sdf.parse("20180713);
Date date2 = sdf.parse("20180930");
LocalDate startDate =
date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate =
date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
long days = ChronoUnit.DAYS.between(startDate, endDate);
return days;
从公历到日期的转换是通过以下方式完成的:
Date newDate = new Date(date1.getTime());