如何使用日历api在java中查找两个日期范围之间的月数
我有两个日期(2012年1月1日、2014年7月31日) 你能帮我计算一下这两个日期之间的月差吗。 如果差异为8个月1天,我需要9个月的结果。您可以使用like 那么你可以这样称呼它如何使用日历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
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))代码>