Вопрос

Сегодня вторник, 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());

Результат строки печати:«Сегодня суббота, 9 января, 00:00:00 по центральному поясному времени 2010 года»

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

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

Это было полезно?

Решение

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

Обсуждение этого есть в соответствующем разделе ТАК вопрос.

Другие советы

Если вы не хотите использовать 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top