开发者

Year incorrect when setting Date value from Calendar.getTime()

开发者 https://www.devze.com 2023-03-27 17:36 出处:网络
I am building a CalendarDisplay application for Android.Among other things, this application allows the user to select the number of days to add to an epoch (epoch is a date in 1899), and that result

I am building a CalendarDisplay application for Android. Among other things, this application allows the user to select the number of days to add to an epoch (epoch is a date in 1899), and that result will be represented graphically on the display. However, when I set Date value from a Calendar value, I get unexpected results: the year seems to be off by a value of 1900. While I could simply add 1900 to the result, that seems like the wrong answer since what I am doing is (I believe) by the book. Or I could continue with what I have; that works too. But that shares the same by-the-book issue. Here is the code, with spare variables for debugging:

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);
}

Now, when I run this code in debug mode as gotoCal(40000), with a breakpoint at the gotoDate() line, I see the following values in the fields: year = 2009 , year2 = 109 , year3 = 2009

Is the Calendar.getTime() function supposed to return a date that's 1900 years in the past (I have seen no such documentation)? Or might I be doing something to influence it to do that? Or what else might I be doing wrong?


You've misread (or not read) the documentation for Date.getYear:

Returns a value that is the result of subtracting 1900 from the year that contains or begins with the instant in time represented by this Date object, as interpreted in the local time zone.

Also:

  • Date.getYear is deprecated, and for good reason. It uses the default time zone, and basically shouldn't be used.

  • Joda Time is much better date and time API. I'd thoroughly recommend using that instead of Date/Calendar.


I did the following to fix this issue on android emulator.

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

In my 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);

In my 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);
0

精彩评论

暂无评论...
验证码 换一张
取 消