Object Date in Java

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

Post by nastya12 »

Бродяга wrote:а почему бы Date не перевести в long и сравнить их? Что-то я никак не пойму в чём проблема :pain1:


Я не знаю в каком формате заданы границы.Есть ли гарантия что время суток у границы поставлено на полночь? Проблема с переведением в miliseconds в том, что часы и минуты нам надо проигнорировать в общем случае.
User avatar
nastya12
Уже с Приветом
Posts: 2622
Joined: 17 Jun 2003 04:41
Location: Canada

Re: Object Date in Java

Post by nastya12 »

Sabina wrote:

Code: Select all

public static Date yesterday (Date adate)
{java.util.Calendar c =  java.util.Calendar.getInstance();
 c.setTime(adate);
 [b]c.set(c.DAY_OF_MONTH, c.get(c.DAY_OF_MONTH)-1);[/b]
 return c.getTime();;
}


Вот этого вот делать нельзя. Откуда Вы знаете какая дата следующая? Даты переводить умеет только календарь.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

nastya12 wrote:Set methods у Date deprecated


А я вроде им и не пользуюсь?

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

Post by nastya12 »

Не пользуетесь и не смогли бы даже если бы захотели.

Ок. Используя Calendar class Вам надо границы подправить на один день с обеих сторон. Как Вы это делаете если Вы не используете Calendar.roll()?

Вот это вот мне не нравится -> c.set(c.DAY_OF_MONTH, c.get(c.DAY_OF_MONTH)-1);

если сегодня 28е какой следующий день? А если февраль месяц? А если год високосный?

On a second thought: Вообще можно не морочиться, просто перевести в long и сравнить

А с long, пришлось бы сначала преобразовывать endDate и startDate и текущую дату в long, потом сравнивать, потом текущую обратно в тот вид, в котором она нужна в приложении.


Зачем обратно?
User avatar
OBender
Уже с Приветом
Posts: 1564
Joined: 27 Nov 2001 10:01
Location: Live free or die

Post by OBender »

Может я чего не понял но вроде как даты всегда (в основном) в long виде сравнивают.
А по поводу вчера сегодня завтра, так:
Date d = new Date(); это вроде как всегда сегодня
а
Date d = new Date( new Date().getLong() - 24 * 60 * 60 * 1000L ); это вчера
ну и
Date d = new Date( new Date().getLong() + 24 * 60 * 60 * 1000L );
вроде как опять же всегда завтра.
Интересный вы человек! Все у вас в порядке. Удивительно, с таким счастьем - и на свободе. (C) О.Бендер
User avatar
nastya12
Уже с Приветом
Posts: 2622
Joined: 17 Jun 2003 04:41
Location: Canada

Post by nastya12 »

OBender, Не понятны условия задачи. Откуда берутся границы? Как Вы напишете code определяюший например данная дата это на этой неделе или нет without the Calendar class?
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

OBender wrote:Может я чего не понял но вроде как даты всегда (в основном) в long виде сравнивают.
А по поводу вчера сегодня завтра, так:
Date d = new Date(); это вроде как всегда сегодня
а
Date d = new Date( new Date().getLong() - 24 * 60 * 60 * 1000L ); это вчера
ну и
Date d = new Date( new Date().getLong() + 24 * 60 * 60 * 1000L );
вроде как опять же всегда завтра.


Да, так проще получается. Ваша правда.
Бродяга, беру свои слова обратно, я не учла, что Date(long date) уже готовый constructor.

Сабина
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Post by Palych »

OBender wrote:Может я чего не понял но вроде как даты всегда (в основном) в long виде сравнивают.
А по поводу вчера сегодня завтра, так:
Date d = new Date(); это вроде как всегда сегодня
а
Date d = new Date( new Date().getLong() - 24 * 60 * 60 * 1000L ); это вчера
ну и
Date d = new Date( new Date().getLong() + 24 * 60 * 60 * 1000L );
вроде как опять же всегда завтра.


Let's assume that now's Dec 10 9:45AM and we need to check if "Dec 11 10:00AM" is tomorrow (is that what you need, Sabina?).
If we calculate "tomorrow" that way, it won't be considered as tomorrow...
Бродяга
Уже с Приветом
Posts: 16086
Joined: 22 Apr 2003 17:57
Location: Колыбель

Post by Бродяга »

Palych wrote:
OBender wrote:Может я чего не понял но вроде как даты всегда (в основном) в long виде сравнивают.
А по поводу вчера сегодня завтра, так:
Date d = new Date(); это вроде как всегда сегодня
а
Date d = new Date( new Date().getLong() - 24 * 60 * 60 * 1000L ); это вчера
ну и
Date d = new Date( new Date().getLong() + 24 * 60 * 60 * 1000L );
вроде как опять же всегда завтра.


Let's assume that now's Dec 10 9:45AM and we need to check if "Dec 11 10:00AM" is tomorrow (is that what you need, Sabina?).
If we calculate "tomorrow" that way, it won't be considered as tomorrow...

Palych, надо просто получить условия задачи, а потом уже и решать её :wink:
Бог создал людей разными, Линкольн дал людям свободу, а Кольт всех уравнял.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Palych wrote:Let's assume that now's Dec 10 9:45AM and we need to check if "Dec 11 10:00AM" is tomorrow (is that what you need, Sabina?).
If we calculate "tomorrow" that way, it won't be considered as tomorrow...


В моем случае dates(checkDate для данного куска кода) в базе в формате UTC и они с минутами, секундами и проч.

startDate и endDate заданы юэером с UI через Date Buttons, то есть они преобразованы к формат, где время округлено до полуночи. То есть скажем 12-е ноября, например, существует в виде - 11/12/2003 00:00:00.

Выборка данных между start и end dates идет из таблиц аудита, где каждая запись имеет timestamp( то что мы выдергиваем как checkDate)
то есть выражения

Code: Select all

Date d = new Date( new Date().getLong() - 24 * 60 * 60 * 1000L ); 
Date d = new Date( new Date().getLong() + 24 * 60 * 60 * 1000L );

мне по идее подойдут, потому что они отрежут/прибавят ровно сутки от полуночи.

Настя, вы совершенно правы про февраль, високосный год и т.д. То есть я в итоге все сделала с Calendar.
Единственное что я не поняла, почему в случае метода roll он переведет дату правильно, а в выражении

Code: Select all

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

нет?

При этом же используется тот же объект - Calendar (c). Неужели он DAY_OF_MONTH прибавляет без учета сколько дней в самом этом MONTH?

Всем большое спасибо!
Сабина
Palych
Уже с Приветом
Posts: 13722
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 проще всего.

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