JavaRush/Java блог/Архив info.javarush/Почему метод clear() класса Calendar не сбрасывает часы?
Core
35 уровень

Почему метод clear() класса Calendar не сбрасывает часы?

Статья из группы Архив info.javarush
участников
Здравствуй, добрый человек! Собственно вопрос в заголовке. Date date1 = new Date(); Calendar calendar = new GregorianCalendar(); calendar.setTime(date1); calendar.clear(Calendar.SECOND); calendar.clear(Calendar.MINUTE); calendar.clear(Calendar.HOUR); System.out.println(date1); System.out.println(calendar.getTime()); На выходе Wed Feb 15 23:02:45 YEKT 2017 Wed Feb 15 23:00:00 YEKT 2017 Почему часы не обнуляются. Пробовал вместо поля HOUR использовать HOUR OF DAY. Не помогает. Что не так?
Комментарии (3)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
dotfinal
Уровень 30
16 февраля 2017, 21:13
А это метод и не должен обнулять. Метод предназначен для сбрасывания значений, «очищения», но это не гарантирует того, что поля обнулятся. Они просто помечаются незаданными. Когда ты файл с жесткого диска удаляешь, то ячейки, в которых он содержался, тоже не обнуляются, они просто помечаются незанятыми. То есть после clear метод isSet вернет false.
В случае с минутами и секундами поля правда обнуляются. Часы обнуляться не будут.
Для обнуления следует использовать, например:
set(Calendar.HOUR_OF_DAY, 0);
Core
Уровень 35
16 февраля 2017, 21:30
Ну c set'ом всё ясно. Решил попробовать clear. Просто мне непонятно, чем обусловлена разница в поведении. Почему для одних филдов сброс синонимичен обнулению (кстати месяц тоже, например, сбрасывается на Jan), а для других нет. Ну ок, спс за ответ всё равно.
dotfinal
Уровень 30
16 февраля 2017, 22:14
Потому что часы — специфичные данные, во-первых, надо учитывать часовой пояс, во-вторых, разные модели отображения (24 и 12). Поэтому под капотом часы хранятся не совсем просто числом в массиве. Перед каждым get'ом объект Calendar пересчитывает все данные. Так вот, при этом часы не зависят от текущего значения поля, а вычисляются, точнее, восстанавливаются из другого. Все остальное, кроме HOUR, HOUR_OF_DAY и AM_PM работает в обычном режиме, соответсвенно и обнуляться эти поля будут