【问题标题】:Difference between 2 dates in months and days in Java 7Java 7中月和日中2个日期之间的差异
【发布时间】:2016-11-15 15:25:14
【问题描述】:

我想计算两个日期的月和天之间的差异,我不想考虑一个月是 30 天并以毫秒为单位获取时间并转换它们,我不想使用这样的库作为 Joda,我还找到了一个使用 LocalDate 的解决方案,但是我使用的是 Java 7。 我寻找我的问题的答案,但找不到任何答案,我尝试了很多方法,我尝试创建一个日历并以毫秒为单位传递我 2 个日期之间的差异,但如果我尝试获取 15/04 之间的差异15/5 我会得到 30 天而不是 1 个月,下面是代码

Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2013);
c.set(Calendar.MONTH, Calendar.APRIL);
c.set(Calendar.DAY_OF_MONTH, 15);

Date startDate = c.getTime();

c.set(Calendar.YEAR, 2013);
c.set(Calendar.MONTH, Calendar.MAY);
c.set(Calendar.DAY_OF_MONTH, 15);

Date lastDate = c.getTime();

Calendar diffCal = Calendar.getInstance();
diffCal.setTimeInMillis(lastDate.getTime() - startDate.getTime());

int months = ((diffCal.get(Calendar.YEAR) - 1970) * 12) + diffCal.get(Calendar.MONTH);
int days   = diffCal.get(Calendar.DAY_OF_MONTH) - 1;

System.out.println("month(s) = " + months); // month(s) = 0
System.out.println("day(s)   = " + days);   // day(s)   = 30

我可以用什么来获得两个日期之间的月差和天数?

编辑:我写了下面的代码,似乎给了我想要的东西,可以使用吗

Date startDate = sdf.parse("31/05/2016");
Date endDate   = sdf.parse("1/06/2016");

Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar   = Calendar.getInstance();

startCalendar.setTime(startDate);
endCalendar.setTime(endDate);

int months = 0, days = 0;

months += ((endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR)) * 12);

int startDays = startCalendar.get(Calendar.DAY_OF_MONTH);
int endDays   = endCalendar.get(Calendar.DAY_OF_MONTH);

if(endDays >= startDays) {
    months += (endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH));
    days   += (endDays - startDays);
} else {
    months += (endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH) - 1);
    days   += ((startCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) - startDays) + endDays);
}

System.out.println("Difference");
System.out.println("Month(s): " + months);
System.out.println("Day(s):   " + days);

【问题讨论】:

  • 您可以尝试使用Joda-Time 库,它在日期方面非常有用
  • 我知道你说你到处检查,但我的谷歌搜索的第一个结果提供了这个帖子:stackoverflow.com/questions/20165564/… 他们从日历中提取时间到日期对象并使用日期中的方法来获得差异以天为单位(检查第一个解决方案)。第二种解决方案:stackoverflow.com/questions/3796841/…
  • @DamCx 他不想使用 Joda。
  • @Babyburger 哎呀,对不起,读得太快了... :( 我的坏
  • 继续在较早日期的月份上加 1,直到再加一个月会使您超过较晚的日期,计算您添加的月数;然后,继续在当天添加 1,直到再添加 1 会使您超过较晚的日期。

标签: java date calendar difference date-difference


【解决方案1】:

您在研究中回答了自己的问题。 JDK7 不支持你想要的。您有三个选择:

  1. 自己写(不要这样做,因为你会犯很多以前犯过的错误)
  2. 使用像 Joda-Time 这样多次推荐的库
  3. 升级到JDK8并使用java.time.Period

【讨论】:

  • 我试图将库保持在最低限度并继续使用 jdk 7。我刚才写了自己的,到目前为止它似乎正在工作,可以使用吗,代码在主帖中
  • 这就是您应该使用库或 JDK8 的原因。您需要针对您认为代码必须处理的情况测试此代码。您是否需要处理超过 1 年的期限?是否需要实现飞跃(每 4、100、400 年)(en.wikipedia.org/wiki/Leap_year)?
  • 我使用的日期的持续时间将小于 1 年,对于闰年,我尝试了不同年份的“startCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)”,它返回 28 或29 基于年份,这是否意味着它可以处理闰年?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2014-04-07
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2013-07-17
相关资源
最近更新 更多