代码之家  ›  专栏  ›  技术社区  ›  codea

添加到Java日历的年份不起作用

  •  7
  • codea  · 技术社区  · 14 年前

    请提醒我:

    我只是想在当前日期加上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;
    }
    

    当我调试这个时,日历总是保持在当前年份。

    有人吗?

    6 回复  |  直到 14 年前
        1
  •  11
  •   stacker    14 年前

    int/long转换有问题:365*24*60*60*1000 其评估值为31536000000,因此超过 Integer.MAX_VALUE 二十一亿四千七百四十八万三千六百四十七 这工作:

    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 );
            } 
    
        2
  •  5
  •   BalusC    14 年前

    你的计算 max 是错的。安 int 不能以毫秒为单位保存一年。

    取而代之的是

    max = ten_year_later.get(Calendar.YEAR) - expiration.get(Calendar.YEAR);
    

    或者更好,使用 JodaTime :

    DateTime tenYearsLater = new DateTime().plusYears(10);
    DateTime expiration = new DateTime(expiration_date.getTime());
    Period period = new Period(expiration, tenYearsLater);
    return period.getYears();
    
        3
  •  4
  •   Bryan James    14 年前

    下面是一个简单的例子,说明应该如何工作。

    Calendar cal = new GregorianCalendar();
    cal.setTime(new Date());
    cal.add(Calendar.YEAR, yearsToAdd);
    Date retDate = cal.getTime();
    

    只需记住用一个长的来获得以毫秒为单位的时间!

        4
  •  1
  •   Paul Tomblin    14 年前

    日历是懒惰的,因此它可能不会重新计算所有其他字段,直到您请求它们。我以前在调试程序中被甩了。如果你 System.out.println(ten_year_later); ?

        5
  •  1
  •   Anon    14 年前

    我在一条评论中注意到,您对一年中的毫秒数的计算不正确(不涉及int/long问题)。

    既然您有两个日历,每个日历可以保存一年,那么为什么不这样编写代码(未编译,因此可能包含拼写错误):

    Calendar cal1 = Calendar.newInstance();   // this will use current time
    cal1.add(Calendar.YEAR, 10);
    Calendar cal2 = Calendar.newInstance();
    cal2.setDate(expiration);
    return cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
    

    假设这就是你真正想要的…

        6
  •  0
  •   jarnbjo    14 年前

    一年中的毫秒数远远超出了int的范围,因此 ten_year_later.getTimeInMillis() - expiration.getTimeInMillis() 和计算 365 * 24 * 60 * 60 * 1000 将计算为不正确的值。

    这个 ten_year_later 应该是正确的。正如R.Bemrose所写,没有必要调用ComputeFields。