Год неверен при установке значения Date из Calendar.getTime()
Я создаю приложение 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 ответа
Вы неправильно прочитали (или не прочитали) документацию по Date.getYear
:
Возвращает значение, которое является результатом вычитания 1900 из года, который содержит или начинается с момента времени, представленного этим объектом Date, как интерпретируется в местном часовом поясе.
Также:
Date.getYear
не рекомендуется и не зря. Он использует часовой пояс по умолчанию и не должен использоваться.Joda Time намного лучше API даты и времени. Я бы настоятельно рекомендовал использовать это вместо
Date
/Calendar
,
Я сделал следующее, чтобы исправить эту проблему на эмуляторе 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);