Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用日历api在java中查找两个日期范围之间的月数_Java - Fatal编程技术网

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

如何使用日历api在java中查找两个日期范围之间的月数,java,Java,我有两个日期(2012年1月1日、2014年7月31日) 你能帮我计算一下这两个日期之间的月差吗。 如果差异为8个月1天,我需要9个月的结果。您可以使用like 那么你可以这样称呼它 public static void main(String[] args) { String start = "01/01/2012"; String end = "31/07/2014"; DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy

我有两个日期(2012年1月1日、2014年7月31日)

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

您可以使用like

那么你可以这样称呼它

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
30
或者,使用

产量也很高

30
编辑

最后(如注释中所建议的),如果您使用的是Java8,那么可以使用新类,如

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));
输出为(静止)

你可以用一个

那么你可以这样称呼它

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
30
或者,使用

产量也很高

30
编辑

最后(如注释中所建议的),如果您使用的是Java8,那么可以使用新类,如

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));
输出为(静止)

工作代码:
日期开始日期和日期结束日期之间的公共整数月数{
日历开始=Calendar.getInstance();
开始设定时间(起始日期);
日历结束=Calendar.getInstance();
结束。设置时间(结束日期);
int monthsbevent=0;
int dateDiff=end.get(日历月日)-start.get(日历月日);
if(dateDiff0){
monthsbween++;
}
}
否则{
monthsbween++;
}      
monthsBetween+=end.get(Calendar.MONTH)-start.get(Calendar.MONTH);
monthsBetween+=(end.get(Calendar.YEAR)-start.get(Calendar.YEAR))*12;
返回月间隔;
}
工作代码:
日期开始日期和日期结束日期之间的公共整数月数{
日历开始=Calendar.getInstance();
开始设定时间(起始日期);
日历结束=Calendar.getInstance();
结束。设置时间(结束日期);
int monthsbevent=0;
int dateDiff=end.get(日历月日)-start.get(日历月日);
if(dateDiff0){
monthsbween++;
}
}
否则{
monthsbween++;
}      
monthsBetween+=end.get(Calendar.MONTH)-start.get(Calendar.MONTH);
monthsBetween+=(end.get(Calendar.YEAR)-start.get(Calendar.YEAR))*12;
返回月间隔;
}
我的代码:

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;
    }
我的代码:

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;
    }
其中to是较晚的日期,from是较早的日期



其中to是较晚的日期,from是较早的日期

如果使用Java 8,请使用新的时间API,
monthsBetween
,否则使用JodaTime@MattCoubrough虽然提到了JodaTime,但流行的答案只是坏主意,在计算时间差时,千万不要尝试使用基本的算术,有太多的变化和模糊的规则,只能让猜测充其量起作用…@我认为我们不需要的是另一个日期问题,它可能有更多糟糕的答案,增加了对正确方法的困惑。如果人们把所有的日期问题都标记为重复问题,我们可能会接近一个标准答案。这是一个骗局,即使前面的问题的答案不是很好。海报上显示的研究成果在哪里?@MadProgrammer如果java.time包确实使旧答案过时,那么应该将新答案发布到那些旧问题上。这并不是一系列重复性问题的借口,这些问题很快就会污染我们的生活。@BasilBourque问题是,流行的接受或高度投票的答案会大量涌现出任何新的内容。我在尝试为Objective C问题找到答案时看到了这一点,这进一步增加了对API或编程经验不足的开发人员的困惑。诚然,这是一个糟糕的问题示例……如果您使用的是Java 8,请使用新的时间API,
Months.monthsBetween
,否则请使用JodaTime@MattCoubrough虽然提到了JodaTime,但流行的答案只是坏主意,在计算时间差时,千万不要尝试使用基本的算术,有太多的变化和模糊的规则,只能让猜测充其量起作用…@我认为我们不需要的是另一个日期问题,它可能有更多糟糕的答案,增加了对正确方法的困惑。如果人们把所有的日期问题都标记为重复问题,我们可能会接近一个标准答案。这是一个骗局,即使前面的问题的答案不是很好。海报上显示的研究成果在哪里?@MadProgrammer如果java.time包确实使旧答案过时,那么应该将新答案发布到那些旧问题上。这并不是一系列重复性问题的借口,这些问题很快就会污染我们的生活。@BasilBourque问题是,流行的接受或高度投票的答案会大量涌现出任何新的内容。我在尝试为Objective C问题找到答案时看到了这一点,这进一步增加了对API或编程经验不足的开发人员的困惑。诚然,这是一个糟糕的问题示例……请添加
localdatefrom=LocalDate.of(2012,01,01)
LocalDate to=LocalDate.of(2014,07,31)
System.out.println(从.到(到,ChronoUnit.MONTHS))对于Java 8,它将涵盖所有基础知识:P@john这是截至2014年8月1日的月数;从2012年1月1日到2014年1月1日24个月,然后6个月到7月,总共30个月(和30天)。@MadProgrammer编辑,使用
DateTimeFormatter
与其他答案保持一致。与没有它的公认答案相比,仍然是一个更好的答案,但谢谢,现在它是一个完整的答案:D@ElliottFrisch谢谢你。但我们需要数七月。1-7月是6的7个月。请添加
localdatefrom=LocalDate.of(2012,01,01)
LocalDate to=LocalDate.of(2014,07,31)
System.out.println(从.到(到,ChronoUnit.MONTHS))