Java DateFormat и SimpleDateFormat возвращают неверную дату
-
19-09-2019 - |
Вопрос
Сегодня вторник, 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();