Подкласс SimpleDateFormat добавляет 1900 к году - PullRequest
4 голосов
/ 17 марта 2012

Я создал пару подклассов SimpleDateFormat, чтобы упростить работу с фидом Azure, о котором я говорю на Android. Один из них выглядит следующим образом:

public class ISO8601TLDateFormat extends SimpleDateFormat {

    private static String mISO8601T = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";

    public ISO8601TLDateFormat() {
        super(mISO8601T);
    }

    public ISO8601TLDateFormat(Locale inLocale) {
        super(mISO8601T, inLocale);
    }
}

Как вы видите, намерение состоит в том, чтобы производить или интерпретировать даты, похожие на

2012-03-17T00: 00: 00,000 + 0100

именно этого ожидает служба Azure. Однако, когда я добавляю Date объекты, построенные из DatePicker, таким образом:

mDate = new Date(mDatePicker.getYear(), mDatePicker.getMonth(), mDatePicker.getDayOfMonth());

Выход ISO8601TLDateFormat равен

3912-03-17T00: 00: 00,000 + 0100

Как видите, год на 1900 больше, чем мне или кому-либо еще, не являющемуся из будущего . Я исследовал объект Date на всем пути к системе каналов Azure, и он сообщает, что его дата - 2012 год, чего я и ожидал. Почему SimpleDateFormat ломается?

1 Ответ

4 голосов
/ 17 марта 2012

Проблема в том, что конструкторы Date не получают того, что вы ожидаете.Взято из документации java :

public Date(int year,
            int month,
            int date)
Deprecated. As of JDK version 1.1, replaced by Calendar.set(year + 1900, month, date) or GregorianCalendar(year + 1900, month, date).
Allocates a Date object and initializes it so that it represents midnight, local time, at the beginning of the day specified by the year, month, and date arguments.
Parameters:
year - the year minus 1900.
month - the month between 0-11.
date - the day of the month between 1-31.

Необходимо помнить, что вы строите дату с 0, 0, 1 1 января 1900 г.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...