Object Date in Java

Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Post by Palych »

Бродяга wrote:Palych, надо просто получить условия задачи, а потом уже и решать её :wink:

S usloviyami lyuboj durak reshit... ;)
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Palych wrote:
Бродяга wrote:Palych, надо просто получить условия задачи, а потом уже и решать её :wink:

S usloviyami lyuboj durak reshit... ;)


Па-а-пр-аашу! :umnik1:

Сабина :)
User avatar
nastya12
Уже с Приветом
Posts: 2622
Joined: 17 Jun 2003 04:41
Location: Canada

Post by nastya12 »

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.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

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 »

2Sabina, календарь все нормально переведет и правильно поймет по умолчанию, так как его флаг Lenient за это отвечает.

Да и Clendar.getInstance() вернет нужную имплементацию (то есть GregorianCalendar), но вам об этом и не надо думать.

Мое мнение - использовать календарь лучше всего, использовать long проще всего.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

SiarheiH wrote:Мое мнение - использовать календарь лучше всего, использовать long проще всего.


Спасибо за пояснения. Я использовала в итоге calendar. А как вы считаете, какой метод лучше использовать для вычитания/прибавления суток:

Code: Select all

Calendar.set(Calendar.DAY_OF_MONTH, Calendar.get(Calendar.DAY_OF_MONTH)-1);


или

Code: Select all

Calendar.roll(....)


Или без разницы?

Сабина
bison
Новичок
Posts: 90
Joined: 20 Aug 2003 11:56
Location: Frankfurt/M

Re: Object Date in Java

Post by bison »

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

Re: Object Date in Java

Post by bison »

bison wrote:
if (!(checkDate.before(startDate) && (!checkDate.after(endDate)))


Sorry, промахнулся


if ((!checkDate.before(startDate) && (!checkDate.after(endDate)))
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: Object Date in Java

Post by Sabina »

bison wrote: if ((!checkDate.before(startDate) && (!checkDate.after(endDate)))


:oops: :oops: :oops:

Сабина
bison
Новичок
Posts: 90
Joined: 20 Aug 2003 11:56
Location: Frankfurt/M

Re: Object Date in Java

Post by bison »


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.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: Object Date in Java

Post by Sabina »

bison wrote: if ((!checkDate.before(startDate) && (!checkDate.after(endDate)))


А на практике этот if не сработал :(

Сабина
bison
Новичок
Posts: 90
Joined: 20 Aug 2003 11:56
Location: Frankfurt/M

Re: Object Date in Java

Post by bison »

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

Re: Object Date in Java

Post by bison »

может вам надо было исключить время ?
тогда что-то вроде :

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

Re: Object Date in Java

Post by bison »

тоже самое без календаря

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.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: Object Date in Java

Post by Sabina »

bison wrote:может вам надо было исключить время ?
тогда что-то вроде :


Cпасибо, я обязательно разберусь в чем там "косяк", вот только разгребу первоочередные проблемы. А то у нас тут навалилось с утра :(

Пока с датами все работает. Может не совсем оптимально, но руки дойдут и пофиксим.

Сабина
bison
Новичок
Posts: 90
Joined: 20 Aug 2003 11:56
Location: Frankfurt/M

Re: Object Date in Java

Post by bison »

С учетом временной зоны

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("мы здесь!") ;
    }

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: Object Date in Java

Post by Sabina »

bison wrote:С учетом временной зоны


Cпасибо,
у нас поправка за временную зону вводится через специальный user format в веб сервисе, то есть на уровне клиента мы уже об этом не беспокоимся ( и слава богу!)

Сабина
SiarheiH
Уже с Приветом
Posts: 297
Joined: 21 Mar 2002 10:01
Location: Minsk, BY -> central NJ

Post by SiarheiH »

Или без разницы? (set(date-1) или roll())


Беглый взгляд на исходный код реализации календаря говорит что разницы нет.

Return to “Вопросы и новости IT”