Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Calendar.set и вычисление даты в несколько шагов, Что я делаю не так? 
V
    Опции темы
Дрон
Дата 9.9.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 92



Волею судеб пишу программку, в которой надо нарисовать календарь на текущий месяц.
Для того, чтобы начать его рисовать надо найти понедельник в той неделе, в которой начинается месяц (этот понедельник чаще всего в предыдущем месяце).
Делаю я, казалось бы, очевидную вещь:
Код

        Calendar startDate = Calendar.getInstance();
        startDate.set(Calendar.DAY_OF_MONTH, 1);
        startDate.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

Но это работает не правильно: в результате получается понедельник текущей недели. Причём меня поначалу ввело в ступор то, что при пошаговом выполнении с проверкой результатов получались верные значения, а при нормальном -- нет.
Удивляюсь. Прибегаю к малоизвестному в народе способу под названием RTFM  smile 
Цитата
Any field values set in a Calendar will not be interpreted until it needs to calculate its time value (milliseconds from the Epoch) or values of the calendar fields. Calling the get, getTimeInMillis, getTime, add and roll involves such calculation. 

Это многое объясняет.
Если между двумя set вставить, например, startDate.getTimeInMillis(), то всё вычисляется как и задумано: сначала переход на первое число, потом переход на понедельник той недели.
Другое дело, что так делать мне совсем не хочется и весь мой опыт протестует, считая это если не грязным хаком, то уж костылём точно.
Только при этом я не могу понять, а как же сделать правильно?

Это сообщение отредактировал(а) Дрон - 9.9.2011, 21:56


--------------------
Да. Именно так.
PM   Вверх
LSD
Дата 10.9.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
        calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
        calendar.set(Calendar.WEEK_OF_YEAR, weekOfYear);

Там фишка в том, что установка "младших" полей может менять старшие.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Дрон
Дата 10.9.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 92



Цитата(LSD @  10.9.2011,  11:47 Найти цитируемый пост)
Там фишка в том, что установка "младших" полей может менять старшие. 

Не совсем, но кое что понял. Надо мне посмотреть, как там Calendar (точнее GregorianCalendar smile ) внутри устроен. После .net с его простым DateTime, который внутри хранит только ticks и пару свойств, тут с одной стороны много разных возможностей, а с другой стороны они как-то мутно работают.
Но судя по твоему примеру я на верном пути -- реально задача у меня более общая, чем я описал, мне просто нужно было понять как правильно работать с этим классом.


--------------------
Да. Именно так.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.