两个日期之间的天数

时间:2014-10-13 23:17:50

标签: java date calendar days

由于某种原因,这将输出大约16348的数值。当第一个和最后一个日期值分别为0110和0201时。为什么我没有得到一天的价值?

import java.util.Scanner;
import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;

public class Project3 {

  public static void main(String[] args) {
  Scanner input = new Scanner(System.in);

  String firstDate = input.next(), lastDate = input.next();

  try {
    Date date1 = new SimpleDateFormat("MMdd").parse(firstDate);
    Date date2 = new SimpleDateFormat("MMdd").parse(lastDate); 
    System.out.println(Project3.days(date1, date2));     
  } catch (Exception e) {
    //
  } 

  }
   public static long days(Date startDate, Date endDate) {
    Calendar start = Calendar.getInstance();
    start.setTime(startDate);
    Calendar end = Calendar.getInstance();
    long daysBetween = 0;
    while(start.before(end)) {
        start.add(Calendar.DAY_OF_MONTH, 1);
        daysBetween++;
    }
    return daysBetween;
 }
}

2 个答案:

答案 0 :(得分:3)

您忘记在end上致电Calendar.setTime(Date)

Calendar end = Calendar.getInstance();
end.setTime(endDate); // <-- like so.

答案 1 :(得分:0)

TL;博士

ChronoUnit.DAYS.between(
    MonthDay.parse( "0110" , DateTimeFormatter.ofPattern( "MMdd" ) ).atYear( 2017 ) ,
    MonthDay.parse( "0201" , DateTimeFormatter.ofPattern( "MMdd" ) ).atYear( 2017 ) 
)

ISO 8601

如果可能,请更改文本格式以符合ISO 8601标准。月日格式为--MM-DD,例如1月10日的--01-10

MonthDay

使用MonthDay课程代表一个月日。

MonthDay md1 = MonthDay.parse( "--01-10" );
MonthDay md2 = MonthDay.pares( "--02-01" );

或使用DateTimeFormatter

MonthDay md = MonthDay.parse(
    "0110" , 
    DateTimeFormatter.ofPattern( "MMdd" )
)

LocalDate

要计算天数,您必须申请一年。由于闰年和2月29日,我们无法在没有一年背景的情况下准确计算经过的天数。

LocalDate ld1 = md1.atYear( 2017 );
LocalDate ld2 = md2.atYear( 2017 );

ChronoUnit

使用ChronoUnit获取已用时间。

long days = ChronoUnit.DAYS.between( ld1 , ld2 );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore