Object Date in Java
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
Object Date in Java
Мне нужно вставить в проверку интервал между двумя датами включительно.
1) Все что я имею на данный момент
if ((checkDate.after(startDate) && (checkDate.before(endDate)))
дает только даты между startDate и endDate при этом исключая сами эти даты, а мне надо включительно.
Метод equals() не годится, он сравнивает до миллисекунд.
Можно преобразовать формат до 00:00:00, но тогда (см.вопрос 2)
2) Если определена константа
Date today = new Date();
как можно определить константы-даты tomorrow и yesterday?
Спасибо,
Сабина
1) Все что я имею на данный момент
if ((checkDate.after(startDate) && (checkDate.before(endDate)))
дает только даты между startDate и endDate при этом исключая сами эти даты, а мне надо включительно.
Метод equals() не годится, он сравнивает до миллисекунд.
Можно преобразовать формат до 00:00:00, но тогда (см.вопрос 2)
2) Если определена константа
Date today = new Date();
как можно определить константы-даты tomorrow и yesterday?
Спасибо,
Сабина
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
-
- Уже с Приветом
- Posts: 16086
- Joined: 22 Apr 2003 17:57
- Location: Колыбель
Re: Object Date in Java
Sabina wrote:Мне нужно вставить в проверку интервал между двумя датами включительно.
1) Все что я имею на данный момент
if ((checkDate.after(startDate) && (checkDate.before(endDate)))
дает только даты между startDate и endDate при этом исключая сами эти даты, а мне надо включительно.
Метод equals() не годится, он сравнивает до миллисекунд.
Можно преобразовать формат до 00:00:00, но тогда (см.вопрос 2)
2) Если определена константа
Date today = new Date();
как можно определить константы-даты tomorrow и yesterday?
Спасибо,
Сабина
Что Вы конкретно хотите сравнить? День с днем? Или день и текущее время?
Бог создал людей разными, Линкольн дал людям свободу, а Кольт всех уравнял.
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
Re: Object Date in Java
Бродяга 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();;
}
Сорри за беспокойство. Вот всегда так, кажется ну никак не разрешишь проблему и как только отпостишь, сразу находится
Сабина
Last edited by Sabina on 10 Dec 2003 01:45, edited 1 time in total.
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
nastya12 wrote:У Вас какое-то очень сложное solution.
Может я объяснила сложно, а задача самая простая и типичная. Нужны данные за период startDate-endDate, включительно, где dates - это java.util.Date. и нужно написать if statement для отбора этих самых дат.
Скажем для чисел все просто if ((y>=a)&&(y<=b))
Как бы вы написали такое условие для джава дат?
Сабина
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
Как раз с Calendar и нужно. -> Calendar.roll(int field, int amount)
"вручную" вычитать прибавять 1 нельзя, потому что нужно смотреть какое число и какой месяц.
Вам нужен GregorianCalendar. Class Date видимо надо трогать по минимму. before() , after() тоже брать из classа GregorianCalendar, а не из Date
"вручную" вычитать прибавять 1 нельзя, потому что нужно смотреть какое число и какой месяц.
Вам нужен GregorianCalendar. Class Date видимо надо трогать по минимму. before() , after() тоже брать из classа GregorianCalendar, а не из Date
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
nastya12 wrote:Как раз с Calendar и нужно.
Так в том и был вопрос
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: Колыбель
Sabina wrote:nastya12 wrote:У Вас какое-то очень сложное solution.
Может я объяснила сложно, а задача самая простая и типичная. Нужны данные за период startDate-endDate, включительно, где dates - это java.util.Date. и нужно написать if statement для отбора этих самых дат.
Скажем для чисел все просто if ((y>=a)&&(y<=b))
Как бы вы написали такое условие для джава дат?
Сабина
а почему бы Date не перевести в long и сравнить их? Что-то я никак не пойму в чём проблема
Бог создал людей разными, Линкольн дал людям свободу, а Кольт всех уравнял.
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
Бродяга wrote:а почему бы Date не перевести в long и сравнить их? Что-то я никак не пойму в чём проблема
А почему же вы раньше молчали ?
Да, с 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, потом сравнивать, потом текущую обратно в тот вид, в котором она нужна в приложении.
Сабина
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
Вы можете либо перевести все в 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
GregorianCalendar is the only implementing subclass (сам Calendar - abstract class)
Бродяга, видимо проблема просто с переводом в long (miliseconds), что Sabina не знает значения границы в miliseconds. Set methods у Date deprecated
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
Бродяга wrote:а почему бы Date не перевести в long и сравнить их? Что-то я никак не пойму в чём проблема
Я не знаю в каком формате заданы границы.Есть ли гарантия что время суток у границы поставлено на полночь? Проблема с переведением в miliseconds в том, что часы и минуты нам надо проигнорировать в общем случае.
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
Re: Object Date in Java
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();;
Вот этого вот делать нельзя. Откуда Вы знаете какая дата следующая? Даты переводить умеет только календарь.
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
Не пользуетесь и не смогли бы даже если бы захотели.
Ок. Используя Calendar class Вам надо границы подправить на один день с обеих сторон. Как Вы это делаете если Вы не используете Calendar.roll()?
Вот это вот мне не нравится -> c.set(c.DAY_OF_MONTH, c.get(c.DAY_OF_MONTH)-1);
если сегодня 28е какой следующий день? А если февраль месяц? А если год високосный?
On a second thought: Вообще можно не морочиться, просто перевести в long и сравнить
Зачем обратно?
Ок. Используя 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, потом сравнивать, потом текущую обратно в тот вид, в котором она нужна в приложении.
Зачем обратно?
-
- Уже с Приветом
- Posts: 1564
- Joined: 27 Nov 2001 10:01
- Location: Live free or die
Может я чего не понял но вроде как даты всегда (в основном) в 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 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) О.Бендер
-
- Уже с Приветом
- Posts: 2622
- Joined: 17 Jun 2003 04:41
- Location: Canada
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
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.
Сабина
-
- Уже с Приветом
- Posts: 13682
- Joined: 16 Jan 2001 10:01
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: Колыбель
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, надо просто получить условия задачи, а потом уже и решать её
Бог создал людей разными, Линкольн дал людям свободу, а Кольт всех уравнял.
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
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?
Всем большое спасибо!
Сабина