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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите разобраться с датами 
:(
    Опции темы
Swatch
Дата 21.1.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: нет
Всего: 1



Добрый день. 

Немного запуталась с датами. Помогите, пожалуйста.

Есть строка, в которой записана дата заведения данных, например, следующая: 01/05/2008 00:00.

Надо проверить условие, чтобы эта дата была не раньше месяца назад, т.е. текущий месяц-1. Но дата в поле String. Я знаю, по шагам, что делать... но что-то туплю. Помогите с кодом, пожалуйста...
PM MAIL   Вверх
AntonSaburov
Дата 21.1.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Код

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm");
Date d = sdf.parse(<твоя строка>);


А дальше смотреть класс Calendar и все, что у него есть. Читать доку все-таки надо иногда.
PM MAIL WWW ICQ   Вверх
vdim
Дата 21.1.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 19.4.2008

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



Я бы сделал так:

Код

    public boolean checkDate(String date) throws ParseException {

        DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        Date d = format.parse(date);

        Date today = new Date();

        Calendar cal = Calendar.getInstance();
        cal.setTime(today);
        cal.add(Calendar.MONTH, -1);

        if (cal.getTime().compareTo(d) < 0) {
            return true;
        }

        return false;
    }


PM MAIL   Вверх
AntonSaburov
Дата 21.1.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Хорошо использовать cal.getTime().before(..)
Обычно нагляднее

PM MAIL WWW ICQ   Вверх
Swatch
Дата 21.1.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: нет
Всего: 1



Так... это ведь получается, что если я ввела дату 25/05/2008, то у меня будет сравниваться с 25/04/2008... а мне нужно, чтобы сравнивалось с 01/04/2008... вот это вызвало у меня затруднения...

Добавлено через 4 минуты и 12 секунд
To AntonSaburov :
а разве cal.getTime().before(..) возвращает не просто результат сравнения, раньше ли была дата или нет? а мне нужно только, чтобы на месяц раньше была...
PM MAIL   Вверх
AntonSaburov
Дата 21.1.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Ну если ровно на месяц - тогд асравнивать конечно надо не так. Я просто на последнюю ремарку написал - 
там-то сравнение на больше-меньше.
PM MAIL WWW ICQ   Вверх
Swatch
Дата 21.1.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: нет
Всего: 1



и еще, после вот этой строчки
Код

cal.add(Calendar.MONTH, -1);

у меня cal.getTime() возвращает текущую дату, но прошлого года.... :(

Добавлено через 1 минуту и 3 секунды
ой, мой косяк... смотрю не туда
PM MAIL   Вверх
vdim
Дата 21.1.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 19.4.2008

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



Я не понял насчет 1 числа, думал через месяц надо. Тогда замени
Код

cal.add(Calendar.MONTH, -1);


на 
Код

cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);



Это сообщение отредактировал(а) vdim - 21.1.2009, 16:58
PM MAIL   Вверх
COVD
Дата 21.1.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

.....чтобы эта дата была не раньше месяца назад, т.е. текущий месяц-1...


Не надо забывать, что не в каждом месяце есть, например, 31 число. Если в календаре волюнтаристки добавить\убавить 1 в поле месяца, то поле числа не изменится. И может получиться несуществующая дата. Поэтому "месяц назад" лучше интерпретировать как 4 недели назад или как-то по другому в зависимости от контекста. 

Это сообщение отредактировал(а) COVD - 21.1.2009, 17:06
PM MAIL   Вверх
ivg
Дата 21.1.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Цитата(COVD @  21.1.2009,  19:01 Найти цитируемый пост)
Если в календаре волюнтаристки добавить\убавить 1 в поле месяца, то поле числа не изменится. И может получиться несуществующая дата.

О каком календаре речь? Если о нашем (GregorianCalendar) то неправда.
PM MAIL   Вверх
COVD
Дата 21.1.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

О каком календаре речь? Если о нашем (GregorianCalendar) то неправда.
 

я использовал метод, кажется, roll и у меня такая проблема возникала. Что меня неприятно удивило. Но с другой стороны, а как определить дату "месяц назад" от сегодня, если количество дней в месяцах разное? Не хотелось бы погружаться, но если я не прав, значит, ошибся.  smile 


PM MAIL   Вверх
ivg
Дата 21.1.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

Репутация: 33
Всего: 81



Цитата(COVD @  21.1.2009,  20:08 Найти цитируемый пост)
я использовал метод, кажется, roll и у меня такая проблема возникала.

Код не вспомните?
Цитата(COVD @  21.1.2009,  20:08 Найти цитируемый пост)
как определить дату "месяц назад" от сегодня, если количество дней в месяцах разное?

Да просто же - если в целевом месяце дней меньше чем текущее число в календаре, то вместе с установкой месяца устанавливается и число на макс. кол-во дней в целевом месяце.
Например для 31.03.2009 
Код

cal.add(Calendar.MONTH, -1);
 получим 28.02.2009.
PM MAIL   Вверх
COVD
Дата 21.1.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Наверное, проблема была именно в том, что я использовал roll, а надо было add. В roll , в отличии от add, меняется только само поле. Они в документации приводят пример, что если календарь стоит на дате  December 31, 1999 и сделать roll(Calendar.MONTH, true), т.е. на месяц вперед, то получим January 31, 1999 . т.е. год переводить в этом случае никто и не обещал. А в методе add старшее поле (год), очевидно, будет скорректировано. Значит, я просто плохо разобрался тогда с документацией.

Цитата

Да просто же - если в целевом месяце дней меньше чем текущее число в календаре, то вместе с установкой месяца устанавливается и число на макс. кол-во дней в целевом месяце.


Логично. 
Спасибо.


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

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

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


 




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


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

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