当前位置: 首页 > 知识库问答 >
问题:

如何使用日历api在java中查找两个日期范围之间的月数

韩单弓
2023-03-14

我有两个约会(01/01/2012, 31/07/2014)。

你能帮我计算一下这两个日期之间的月差吗。如果差异是8个月1天,我需要9个月的结果。

共有3个答案

濮阳鸿祯
2023-03-14

我的代码:

int getMonthCountBetween(Calendar cal1, Calendar cal2) {

        if(cal1.compareTo(cal2)>0) {
            Calendar cal=cal1;
            cal1=cal2;
            cal2=cal;
        }

        int months=0;

        int y1 = cal1.get(Calendar.YEAR);
        int y2 = cal2.get(Calendar.YEAR);

        int m1 = cal1.get(Calendar.MONTH);
        int m2 = cal2.get(Calendar.MONTH);

        if (y2 - y1 >= 0) {
            months = m2 - m1 + 1;
        }
        if (y2 - y1 >= 1) {
            months += 12;
        }
        if (y2 - y1 >= 2) {
            months += 12 * (y2 - y1 - 1);
        }

        return months;
    }
濮阳征
2023-03-14

你可以使用一个日历

static int monthsBetween(Date a, Date b) {
    Calendar cal = Calendar.getInstance();
    if (a.before(b)) {
        cal.setTime(a);
    } else {
        cal.setTime(b);
        b = a;
    }
    int c = 0;
    while (cal.getTime().before(b)) {
        cal.add(Calendar.MONTH, 1);
        c++++;
    }
    return c - 1;
}

然后你可以这样称呼它

public static void main(String[] args) {
    String start = "01/01/2012";
    String end = "31/07/2014";
    DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        System.out.println(monthsBetween(sdf.parse(start), sdf.parse(end)));
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

输出是

30

或者用Joda-Time

String start = "01/01/2012";
String end = "31/07/2014";
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try {
    LocalDate a = LocalDate.fromDateFields(sdf.parse(start));
    LocalDate b = LocalDate.fromDateFields(sdf.parse(end));
    Period p = new Period(a, b);
    System.out.println((p.getYears() * 12) + p.getMonths());
} catch (ParseException e) {
    e.printStackTrace();
}

产量也在下降

30

编辑

最后(如注释中建议的),如果您使用Java8,您可以使用新的java.time类,如

String start = "01/01/2012";
String end = "31/07/2014";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate from = LocalDate.parse(start, formatter);
LocalDate to = LocalDate.parse(end, formatter);
System.out.println(from.until(to, ChronoUnit.MONTHS));

输出是(仍然)

30
姬乐
2023-03-14
Working Code:

public int monthsBetweenDates(Date startDate, Date endDate){

        Calendar start = Calendar.getInstance();
        start.setTime(startDate);

        Calendar end = Calendar.getInstance();
        end.setTime(endDate);

          int monthsBetween = 0;
            int dateDiff = end.get(Calendar.DAY_OF_MONTH)-start.get(Calendar.DAY_OF_MONTH);      

if(dateDiff<0) {
                int borrrow = end.getActualMaximum(Calendar.DAY_OF_MONTH);           
                 dateDiff = (end.get(Calendar.DAY_OF_MONTH)+borrrow)-start.get(Calendar.DAY_OF_MONTH);
                 monthsBetween--;

if(dateDiff>0) {
                     monthsBetween++;
                 }
            }
            else {
                monthsBetween++;
            }      
            monthsBetween += end.get(Calendar.MONTH)-start.get(Calendar.MONTH);      
            monthsBetween  += (end.get(Calendar.YEAR)-start.get(Calendar.YEAR))*12;      
            return monthsBetween;
     }
 类似资料:
  • 问题内容: 它给出以下内容: 但是我想获得下个月的定义,该怎么办? 问题答案: 表达方式 给。我们期望这两个值都指向每月的最后几天。如果将1天添加到值中,我们将获得下个月的第一天, 会给我们1个月的预期时间。因此,让我们检查是否有一个月的最后两天,在这种情况下,我们要返回第二天的年龄间隔。在其他情况下,我们将返回原始值的年龄间隔: 一些例子:

  • 问题内容: 我的数据库中有以下一组匹配日期的日期(dd / MM / yyyy): 事件具有开始和结束日期(时间无关紧要),并且endDate为NULL表示事件仍在进行中。 我想确定的是两个任意日期之间的日期范围,其中a)没有事件,b)事件重叠。 因此,对于输入日期范围01/04/2009-30/06/2009,我希望得到以下结果: 注意,作为结果,两个相邻的重叠范围是可以接受的。 谁能用SQL算

  • 问题内容: 我的问题类似于以下问题: http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:14582643282111 区别在于我的内部查询返回两条记录,而我有外部查询。 我需要编写类似这样的内部查询,这将为我提供两个日期范围之间的日期列表(我正在尝试不执行此查询)。 我的内部查询返回以下2行: 所以我需要内部查

  • 问题内容: 如何使用PHP查找两个日期之间的天数? 问题答案:

  • 问题内容: 我需要填充一个表,该表将存储2个给定日期之间的日期范围:09/01/11-10/10/11 因此,在这种情况下,该表将从2011年9月1日开始存储,直到每天存储到10/10/11,我想知道在SQL Server中是否有一种巧妙的方法-我目前正在使用SQL Server 2008 。 谢谢 问题答案: 在SQL 2005+上很容易;如果您有数字表或理货表,操作会更容易。我在下面伪造了它:

  • 我使用下面的代码计算两个日期之间的年、月和天的数目,使用 以上代码的预期输出是(使用此站点并使用google play store中的一个应用程序进行勾选) null 如果需要更多的信息请告诉我。提前道谢。你的努力将会受到赞赏。