Год неверен при установке значения Date из Calendar.getTime () - PullRequest
1 голос
/ 13 августа 2011

Я создаю приложение CalendarDisplay для Android. Помимо прочего, это приложение позволяет пользователю выбирать количество дней, которые нужно добавить к эпохе (эпоха - это дата в 1899 г.), и этот результат будет графически представлен на дисплее. Однако, когда я устанавливаю значение Date из значения Calendar, я получаю неожиданные результаты: кажется, что год отличается от значения 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, год2 = 109, год3 = 2009

Является ли функция Calendar.getTime () предполагаемой , чтобы вернуть дату, прошедшую 1900 лет назад (я не видел такой документации)? Или я могу что-то сделать, чтобы повлиять на это? Или что еще я могу делать не так?

Ответы [ 2 ]

6 голосов
/ 13 августа 2011

Вы неправильно прочитали (или не прочитали) документацию для Date.getYear:

Возвращает значение, которое является результатом вычитания 1900 из года, содержащего илиначинается с момента времени, представленного этим объектом Date, как интерпретируется в местном часовом поясе.

Также:

  • Date.getYear устарело, ипо уважительной причине.Он использует часовой пояс по умолчанию, и в основном не должен использоваться.

  • Joda Time - намного лучший API даты и времени.Я бы настоятельно рекомендовал использовать это вместо Date / Calendar.

0 голосов
/ 07 июля 2012

Для устранения этой проблемы на эмуляторе 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);
...