Object Date in Java

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

Object Date in Java

Post by Sabina »

Мне нужно вставить в проверку интервал между двумя датами включительно.

1) Все что я имею на данный момент

if ((checkDate.after(startDate) && (checkDate.before(endDate)))

дает только даты между startDate и endDate при этом исключая сами эти даты, а мне надо включительно.
Метод equals() не годится, он сравнивает до миллисекунд.
Можно преобразовать формат до 00:00:00, но тогда (см.вопрос 2)

2) Если определена константа
Date today = new Date();

как можно определить константы-даты tomorrow и yesterday?

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

Post by nastya12 »

Прибавляте очень небольшое значение к границам (несколько milliseconds)
Бродяга
Уже с Приветом
Posts: 16086
Joined: 22 Apr 2003 17:57
Location: Колыбель

Re: Object Date in Java

Post by Бродяга »

Sabina wrote:Мне нужно вставить в проверку интервал между двумя датами включительно.

1) Все что я имею на данный момент

if ((checkDate.after(startDate) && (checkDate.before(endDate)))

дает только даты между startDate и endDate при этом исключая сами эти даты, а мне надо включительно.
Метод equals() не годится, он сравнивает до миллисекунд.
Можно преобразовать формат до 00:00:00, но тогда (см.вопрос 2)

2) Если определена константа
Date today = new Date();

как можно определить константы-даты tomorrow и yesterday?

Спасибо,
Сабина

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

Post by Sabina »

nastya12 wrote:Прибавляте очень небольшое значение к границам (несколько milliseconds)


Что-то не пойму что мне это даст? :oops:
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: Object Date in Java

Post by Sabina »

Бродяга wrote:Что Вы конкретно хотите сравнить? День с днем? Или день и текущее время?


Мне нужны дни, но before и after тут тоже годятся, поскольку мне и надо после полуночи startDate UTC, только вот включая эту самую startDate.

По-моему я нашла как это дело решается, нужно использовать класс Calendar, а оттуда

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

Сорри за беспокойство. Вот всегда так, кажется ну никак не разрешишь проблему и как только отпостишь, сразу находится :D

Сабина
Last edited by Sabina on 10 Dec 2003 01:45, edited 1 time in total.
User avatar
nastya12
Уже с Приветом
Posts: 2622
Joined: 17 Jun 2003 04:41
Location: Canada

Post by nastya12 »

У Вас какое-то очень сложное solution. :wink: А что с чем надо сравнить? Current time с фиксированными датами? Где играют роль часовые пояса?
User avatar
nastya12
Уже с Приветом
Posts: 2622
Joined: 17 Jun 2003 04:41
Location: Canada

Post by nastya12 »

Грубо говоря Вам надо определить пришедшая дата - это сегодня или нет? ...расчлените ее на год, месяц, день и сравните, это легко in java
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

nastya12 wrote:У Вас какое-то очень сложное solution. :wink:


Может я объяснила сложно, а задача самая простая и типичная. Нужны данные за период startDate-endDate, включительно, где dates - это java.util.Date. и нужно написать if statement для отбора этих самых дат.

Скажем для чисел все просто if ((y>=a)&&(y<=b))

Как бы вы написали такое условие для джава дат?

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

Post by nastya12 »

Можно вычесть один день из левой границы и прибавить один день к правой.

a <= x <= b эквивалентно a - 1 < x < b + 1 в целых числах
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

nastya12 wrote:Можно вычесть один день из левой границы и прибавить один день к правой.

a <= x <= b эквивалентно a - 1 < x < b + 1 в целых числах


Как вычесть этот самый день без использования класса Calendar? Ведь в датах из методов есть только after и before?

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

Post by nastya12 »

Как раз с Calendar и нужно. -> Calendar.roll(int field, int amount)
"вручную" вычитать прибавять 1 нельзя, потому что нужно смотреть какое число и какой месяц.

Вам нужен GregorianCalendar. Class Date видимо надо трогать по минимму. before() , after() тоже брать из classа GregorianCalendar, а не из Date
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

nastya12 wrote:Как раз с Calendar и нужно.


Так в том и был вопрос :D

nastya12 wrote:Вам нужен GregorianCalendar. Class Date видимо надо трогать по минимму. before() , after() тоже брать из classа GregorianCalendar, а не из Date


А зачем Gregorian? У меня BC дат нет?
А чем before и after из java.util.date не годятся?

Сабина
Бродяга
Уже с Приветом
Posts: 16086
Joined: 22 Apr 2003 17:57
Location: Колыбель

Post by Бродяга »

Sabina wrote:
nastya12 wrote:У Вас какое-то очень сложное solution. :wink:


Может я объяснила сложно, а задача самая простая и типичная. Нужны данные за период startDate-endDate, включительно, где dates - это java.util.Date. и нужно написать if statement для отбора этих самых дат.

Скажем для чисел все просто if ((y>=a)&&(y<=b))

Как бы вы написали такое условие для джава дат?

Сабина

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

Post by Sabina »

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


А почему же вы раньше молчали :) ?
Да, с long тоже можно, но по-моему с calendar решение получилось как бы это сказать, красивее что ли:

Пишем два метода beforeStartDate(Date startDate) и afterEndDate(Date endDate)

и потом пишем if

Code: Select all

if ((checkDate.after(beforeStartDate(startDate))) && (checkDate.before(afterEndDate(endDate))))


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

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

Post by nastya12 »

Вы можете либо перевести все в milliseconds и сравнивать (тогда границы надо поставить на полночь), либо использовать Calendar class. В каком формате у Вас даны эти границы? before(), after() можно взять из Date, но как Вы будете прибавлять, вычитать 1 без использования Calendar.roll()?

GregorianCalendar is the only implementing subclass (сам Calendar - abstract class)

Бродяга, видимо проблема просто с переводом в long (miliseconds), что Sabina не знает значения границы в miliseconds. Set methods у Date deprecated
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: 13682
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?

Всем большое спасибо!
Сабина

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