Java日历添加年份不起作用

cod*_*dea 8 java calendar

请关注我:

我只是想在当前日期添加10年,然后从中减去过期日期以返回年数:

public int getMaxYears() {
  int max = 0;
  Calendar ten_year_later = Calendar.getInstance();
  ten_year_later.setTime(new Date());
  ten_year_later.add(Calendar.YEAR, 10);
  Calendar expiration = Calendar.getInstance();
  expiration.setTime(expiration_date);
  max = (int) (ten_year_later.getTimeInMillis() - expiration.getTimeInMillis())/(365 * 24 * 60 * 60 * 1000);
  return max;
}
Run Code Online (Sandbox Code Playgroud)

当我调试它时,日历始终保持在当前年份.

任何人 ?

sta*_*ker 11

你有一个int/long转换问题:365*24*60*60*1000其评估为31536000000,因此超过Integer.MAX_VALUE2147483647这适用:

public static void main(String[] args) {
          Calendar ten_year_later = Calendar.getInstance();
          System.out.println( ten_year_later.getTime() );
          ten_year_later.setTime(new Date()); 
          ten_year_later.add(Calendar.YEAR, 10);
          System.out.println( ten_year_later.getTime() );
          Calendar expiration = Calendar.getInstance(); 
          expiration.setTime(expiration.getTime()); 
          long max = (ten_year_later.getTimeInMillis() - expiration.getTimeInMillis())/(365 * 24 * 60 * 60 * 1000L); 
          System.out.println( "max " + max );
        } 
Run Code Online (Sandbox Code Playgroud)


Bal*_*usC 5

你的计算max是错误的.一个int不能以毫秒每年举行.

而是替换它

max = ten_year_later.get(Calendar.YEAR) - expiration.get(Calendar.YEAR);
Run Code Online (Sandbox Code Playgroud)

或者更好,使用JodaTime:

DateTime tenYearsLater = new DateTime().plusYears(10);
DateTime expiration = new DateTime(expiration_date.getTime());
Period period = new Period(expiration, tenYearsLater);
return period.getYears();
Run Code Online (Sandbox Code Playgroud)


Bry*_*mes 5

这是一个简单的例子,说明什么应该起作用。

Calendar cal = new GregorianCalendar();
cal.setTime(new Date());
cal.add(Calendar.YEAR, yearsToAdd);
Date retDate = cal.getTime();
Run Code Online (Sandbox Code Playgroud)

请记住使用 long 来获取以毫秒为单位的时间!