从Calendar.getTime()设置日期值时年份不正确

时间:2011-08-13 15:53:35

标签: java date calendar gettime

我正在为Android构建CalendarDisplay应用程序。除此之外,该应用程序允许用户选择添加到纪元的天数(纪元是1899年的日期),并且该结果将在显示器上以图形方式表示。但是,当我从日历值设置日期值时,我得到了意想不到的结果:年份似乎偏离了1900的值。虽然我可以简单地将1900添加到结果中,但这似乎是错误的答案,因为我在做什么是(我相信)这本书。或者我可以继续我拥有的东西;这也有效。但是,它有相同的副本问题。这是代码,带有用于调试的备用变量:

public void gotoCal(int days) {
    // epochCal has been initialized as follows:
    // (HYF_BASE_YEAR = 1899,  HYF_BASE_MONTH = 11, HYF_BASE_DAY = 1)
    // epochCal = (Calendar) Calendar.getInstance();
    // epochCal.set(HYF_BASE_YEAR, HYF_BASE_MONTH, HYF_BASE_DAY);

    Calendar cal = (Calendar) epochCal.clone();
    cal.add(Calendar.DATE, days);
    int year = cal.get(Calendar.YEAR);
    Date date = cal.getTime();
    int year2 = date.getYear();
    if (year2 != year) {
        date.setYear(year);
    }
    int year3 = date.getYear();
    gotoDate(date);
}

现在,当我在调试模式下以gotoCal(40000)运行此代码时,在gotoDate()行有一个断点,我在字段中看到以下值:     年= 2009年,     year2 = 109,     year3 = 2009

Calendar.getTime()函数假定是否返回过去1900年的日期(我没有看过这样的文档)?或者我可能会做些什么来影响它呢?或者我还有什么其他错误?

2 个答案:

答案 0 :(得分:6)

您误读(或未阅读)Date.getYear的文档:

  

返回一个值,该值是从包含或以此Date对象表示的时间开始的年份减去1900的结果,如本地时区中所解释的那样。

此外:

  • Date.getYear已被弃用,并且有充分的理由。它使用默认时区,基本上不应该使用。

  • Joda Time很多更好的日期和时间API。我完全建议使用它而不是Date / Calendar

答案 1 :(得分:0)

我在Android模拟器上做了以下修复此问题。

private Date insuranceExpiryDate = new Date(Calendar.getInstance().getTime().getTime());
private int mYear, mMonth, mDay ;

在我的onCreate

Calendar c = Calendar.getInstance() ;
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
insuranceExpiryDate.setYear(year) ;
insuranceExpiryDate.setMonth(month) ;
insuranceExpiryDate.setDate(day);

在我的onCreateDialog

case INSURANCE_EXPIRY:
changeInsuranceExpiryDialog = new DatePickerDialog(this,
    new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(
        DatePicker changeInsuranceDatePicker, int year,
            int month, int day) {
                god.updateDisplay(changeInsuranceExpiryDate,
                insuranceExpiryDate, year, month, day);
        }
    }, mYear, mMonth, mDay);
相关问题