Java DateFormat и SimpleDateFormat возвращают неверную дату - PullRequest
0 голосов
/ 10 февраля 2010

Сегодня вторник, 9 февраля 2010 г., и когда я печатаю дату, я получаю неправильную дату:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date today = formatter.parse(String.format("%04d-%02d-%02d",
        Calendar.getInstance().get(Calendar.YEAR),
        Calendar.getInstance().get(Calendar.MONTH),
        Calendar.getInstance().get(Calendar.DAY_OF_MONTH)));

System.out.println("Today is " + today.toString());

Строка печати приводит к следующему: «Сегодня суббота, 09 января 00:00:00 CST 2010»

Скорее всего, это не суббота, 9 января, это вторник, 9 февраля. Я предполагаю, что делаю что-то не так, поэтому кто-нибудь может дать мне знать, что здесь не так? Нужно ли вручную устанавливать день недели?

Обновление Примечание: я не хочу инициализировать сегодня с new Date(), потому что я хочу, чтобы часы, минуты, секунды и миллисекунды были инициализированы на 0. Это необходимо, чтобы я мог сравнить дату ввода пользователя с сегодняшним днем: если пользователь вводит сегодняшнюю дату, и я использую средство форматирования для создания объекта Date, тогда, если я инициализирую сегодня с помощью new Date() и сравниваю две даты, сегодня будет после выбранная пользователем дата (что неверно). Таким образом, мне нужно инициализировать сегодня в начале дня без часов / мин / сек / мс.

Ответы [ 2 ]

9 голосов
/ 10 февраля 2010

Смешно, календарные месяцы отсчитываются от 0 (январь) до 11 (декабрь), поэтому вы передаете «2010-01-09» в formatter.parse () при извлечении поля MONTH из календаря.

Это обсуждается в связанном ТАК вопрос .

3 голосов
/ 10 февраля 2010

Если вы не хотите использовать JodaTime, вы можете использовать:

Calendar calendar = Calendar.getInstance();

calendar.set( Calendar.HOUR_OF_DAY, 0 );
calendar.set( Calendar.MINUTE, 0 );
calendar.set( Calendar.SECOND, 0 );
calendar.set( Calendar.MILLISECOND, 0 );

Date today = calendar.getTime();

Это гораздо более эффективно и менее подвержено ошибкам, чем ваш подход форматирования / анализа строк.

Если вы можете использовать JodaTime, это очень предпочтительный метод:

LocalDate date = new DateTime().toLocaleDate();
...