Palych
Уже с Приветом
Posts: 13682 Joined: 16 Jan 2001 10:01
Post
by Palych » 10 Dec 2003 19:32
Бродяга wrote: Palych, надо просто получить условия задачи, а потом уже и решать её
S usloviyami lyuboj durak reshit...
Sabina
Уже с Приветом
Posts: 5669 Joined: 13 Oct 2000 09:01
Location: East Bay, CA
Post
by Sabina » 10 Dec 2003 20:01
Palych wrote: Бродяга wrote: Palych, надо просто получить условия задачи, а потом уже и решать её
S usloviyami lyuboj durak reshit...
Па-а-пр-аашу!
Сабина
nastya12
Уже с Приветом
Posts: 2622 Joined: 17 Jun 2003 04:41
Location: Canada
Post
by nastya12 » 10 Dec 2003 20:10
Sabina wrote: Единственное что я не поняла, почему в случае метода roll он переведет дату правильно, а в выражении
Code: Select all
c.set(c.DAY_OF_MONTH, c.get(c.DAY_OF_MONTH)-1);
нет?
При этом же используется тот же объект - Calendar (c). Неужели он DAY_OF_MONTH прибавляет без учета сколько дней в самом этом MONTH?
1. roll() переводит правильно, а первоначальный метод нет, он делает ровно то, что его просили, вы запрашиваете значение через get(), делаете с ним какие-то манипуляции в обход класса (вычитатете единичку из int), и после этого сажаете обратно через set(). Calendar знать не знает что от него хотят предыдущее значение.
2. ИМХО, если надо сравнить интервал, то лучше делать Бродягиным методом (первести в long и сравнить). Если сгенерировать несколько дат в промежутке - то лучше через Calendar.
Sabina
Уже с Приветом
Posts: 5669 Joined: 13 Oct 2000 09:01
Location: East Bay, CA
Post
by Sabina » 10 Dec 2003 20:44
nastya12 wrote: 2. ИМХО, если надо сравнить интервал, то лучше делать Бродягиным методом (первести в long и сравнить).
Но ведь тогда интервал получиться например 5 февраля - 29 февраля вместо 5 февраля - 1 марта для високосного года ?
Сабина
SiarheiH
Уже с Приветом
Posts: 297 Joined: 21 Mar 2002 10:01
Location: Minsk, BY -> central NJ
Post
by SiarheiH » 11 Dec 2003 18:12
2Sabina , календарь все нормально переведет и правильно поймет по умолчанию, так как его флаг Lenient за это отвечает.
Да и Clendar.getInstance() вернет нужную имплементацию (то есть GregorianCalendar), но вам об этом и не надо думать.
Мое мнение - использовать календарь лучше всего, использовать long проще всего.
Sabina
Уже с Приветом
Posts: 5669 Joined: 13 Oct 2000 09:01
Location: East Bay, CA
Post
by Sabina » 11 Dec 2003 18:30
SiarheiH wrote: Мое мнение - использовать календарь лучше всего, использовать long проще всего.
Спасибо за пояснения. Я использовала в итоге calendar. А как вы считаете, какой метод лучше использовать для вычитания/прибавления суток:
Code: Select all
Calendar.set(Calendar.DAY_OF_MONTH, Calendar.get(Calendar.DAY_OF_MONTH)-1);
или
Или без разницы?
Сабина
bison
Новичок
Posts: 90 Joined: 20 Aug 2003 11:56
Location: Frankfurt/M
Post
by bison » 11 Dec 2003 19:11
Sabina wrote: Мне нужно вставить в проверку интервал между двумя датами включительно. if ((checkDate.after(startDate) && (checkDate.before(endDate))) дает только даты между startDate и endDate при этом исключая сами эти даты, а мне надо включительно. Спасибо, Сабина
if (!(checkDate.before(startDate) && (!checkDate.after(endDate)))
bison
Новичок
Posts: 90 Joined: 20 Aug 2003 11:56
Location: Frankfurt/M
Post
by bison » 11 Dec 2003 19:13
bison wrote: if (!(checkDate.before(startDate) && (!checkDate.after(endDate)))
Sorry, промахнулся
if ((!checkDate.before(startDate) && (!checkDate.after(endDate)))
Sabina
Уже с Приветом
Posts: 5669 Joined: 13 Oct 2000 09:01
Location: East Bay, CA
Post
by Sabina » 11 Dec 2003 19:38
bison wrote: if ((!checkDate.before(startDate) && (!checkDate.after(endDate)))
Сабина
bison
Новичок
Posts: 90 Joined: 20 Aug 2003 11:56
Location: Frankfurt/M
Post
by bison » 11 Dec 2003 19:39
Date today = new Date(), tomorrow, yersterday ; Calendar cal = Calendar.getInstance() ; cal.setTime(today) ; cal.add(Calendar.DATE, 1); tomorrow = cal.getTime() ; cal.add(Calendar.DATE, -2); yersterday = cal.getTime() ;
или без календаря
long day = 24 * 60 * 60 * 1000L ; tomorrow.setTime(today.getTime() + day ) ; yersterday.setTime(today.getTime() - day ) ;
Last edited by bison on 11 Dec 2003 21:38, edited 2 times in total.
Sabina
Уже с Приветом
Posts: 5669 Joined: 13 Oct 2000 09:01
Location: East Bay, CA
Post
by Sabina » 11 Dec 2003 20:15
bison wrote: if ((!checkDate.before(startDate) && (!checkDate.after(endDate)))
А на практике этот if не сработал
Сабина
bison
Новичок
Posts: 90 Joined: 20 Aug 2003 11:56
Location: Frankfurt/M
Post
by bison » 11 Dec 2003 21:00
Sabina wrote: bison wrote: if ((!checkDate.before(startDate) && (!checkDate.after(endDate)))
А на практике этот if не сработал
Сабина
Значит у вас где-то косяк или условия задачи даны не полностью
У нас всё точно:
Code: Select all
Date date = new Date() ; Date startDate = (Date)date.clone() ; Date endDate = (Date)date.clone() ; if (!date.before(startDate) && !date.after(endDate)) { System.out.println("мы здесь!") ; }
bison
Новичок
Posts: 90 Joined: 20 Aug 2003 11:56
Location: Frankfurt/M
Post
by bison » 11 Dec 2003 21:16
может вам надо было исключить время ?
тогда что-то вроде :
Code: Select all
Calendar cal = Calendar.getInstance() ; cal.setTime(startDate) ; cal.clear(Calendar.HOUR); cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); startDate=cal.getTime() ; cal.setTime(endDate) ; cal.add(Calendar.DATE, 1); cal.clear(Calendar.HOUR); cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); endDate=cal.getTime() ; if (!date.before(startDate) && date.before(endDate)) { System.out.println("мы здесь!") ; }
Last edited by bison on 11 Dec 2003 21:29, edited 1 time in total.
bison
Новичок
Posts: 90 Joined: 20 Aug 2003 11:56
Location: Frankfurt/M
Post
by bison » 11 Dec 2003 21:27
тоже самое без календаря
Code: Select all
long day = 24 * 60 * 60 * 1000L ; startDate.setTime(startDate.getTime() - startDate.getTime() % day ) ; endDate.setTime(endDate.getTime() + day - endDate.getTime() % day ) ; if (!date.before(startDate) && date.before(endDate)) { System.out.println("мы здесь!") ; }
Last edited by bison on 11 Dec 2003 21:37, edited 2 times in total.
Sabina
Уже с Приветом
Posts: 5669 Joined: 13 Oct 2000 09:01
Location: East Bay, CA
Post
by Sabina » 11 Dec 2003 21:27
bison wrote: может вам надо было исключить время ? тогда что-то вроде :
Cпасибо, я обязательно разберусь в чем там "косяк", вот только разгребу первоочередные проблемы. А то у нас тут навалилось с утра
Пока с датами все работает. Может не совсем оптимально, но руки дойдут и пофиксим.
Сабина
bison
Новичок
Posts: 90 Joined: 20 Aug 2003 11:56
Location: Frankfurt/M
Post
by bison » 11 Dec 2003 22:01
С учетом временной зоны
Code: Select all
long day = 24 * 60 * 60 * 1000L ; long zone = date.getTimezoneOffset() * 60 * 1000L ; startDate.setTime(startDate.getTime() - startDate.getTime() % day + zone ) ; endDate.setTime(endDate.getTime() + day - endDate.getTime() % day + zone ) ; if (!date.before(startDate) && date.before(endDate)) { System.out.println("мы здесь!") ; }
Sabina
Уже с Приветом
Posts: 5669 Joined: 13 Oct 2000 09:01
Location: East Bay, CA
Post
by Sabina » 11 Dec 2003 22:28
bison wrote: С учетом временной зоны
Cпасибо,
у нас поправка за временную зону вводится через специальный user format в веб сервисе, то есть на уровне клиента мы уже об этом не беспокоимся ( и слава богу!)
Сабина
SiarheiH
Уже с Приветом
Posts: 297 Joined: 21 Mar 2002 10:01
Location: Minsk, BY -> central NJ
Post
by SiarheiH » 15 Dec 2003 18:54
Или без разницы? (set(date-1) или roll())
Беглый взгляд на исходный код реализации календаря говорит что разницы нет.