Как получить последние 30/60/90 дней записей с указанной даты в java?
У меня есть записи с receivedDate. Я хочу получить записи за последние 30 или 60 или 90 дней с полученной даты. Как его решить?
Как получить последние 30/60/90 дней записей с указанной даты в java?
У меня есть записи с receivedDate. Я хочу получить записи за последние 30 или 60 или 90 дней с полученной даты. Как его решить?
Используйте java.util.Calendar.
Date today = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(today);
cal.add(Calendar.DAY_OF_MONTH, -30);
Date today30 = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, -60);
Date today60 = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, -90);
Date today90 = cal.getTime();
LocalDate // Represent a date-only value, without time-of-day and without time zone.
.now( // Capture today date as seen in the wall-clock time used by the people of a particular region (a time zone).
ZoneId.of( "Asia/Tokyo" ) // Specify the desired/expected zone.
) // Returns a 'LocalDate' object.
.minus( // Subtract a span-of-time.
Period.ofDays( 30 ) // Represent a span-of-time unattached to the timeline in terms of years-months-days.
) // Returns another 'LocalDate' object.
Связанная группа классов java.util.Date &.Calendar общеизвестно хлопотна. Избежать их.
Современный подход использует классы java.time, встроенные в Java 8 и более поздние версии, и перенесенные в Java 6 & 7.
LocalDate
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса или смещения от UTC.
Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему миру в зависимости от зоны. Например, через несколько минут после полуночи в Париже Франция - новый день, а в Монреале-Квебеке все еще "вчера".
Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше явно указать желаемый/ожидаемый часовой пояс в качестве аргумента. Если критично, подтвердите зону с вашим пользователем.
Укажите правильное имя часового пояса в формате Continent/Region
, например, America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4-буквенное сокращение, такое как EST
или IST
как они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Если вы хотите использовать текущий часовой пояс по умолчанию для JVM, попросите его и передайте в качестве аргумента. Если опущен, код становится неоднозначным для чтения, так как мы не знаем наверняка, намеревались ли вы использовать значение по умолчанию или если вы, как и многие программисты, не знали о проблеме.
ZoneId z = ZoneId.systemDefault() ; // Get JVMs current default time zone.
Или укажите дату. Вы можете установить месяц по номеру, с нормальным номером 1-12 для января-декабря.
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
Или, лучше, использовать предварительно определенные объекты перечисления Month
, по одному на каждый месяц года. Совет: используйте эти объекты Month
всей вашей кодовой базе, а не просто целое число, чтобы сделать ваш код более самодокументированным, обеспечить допустимые значения и обеспечить безопасность типов. То же YearMonth
для Year
& YearMonth
.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
Вы можете определить промежуток времени в терминах лет-месяцев-дней с помощью класса Period
.
Period days_30 = Period.ofDays( 30 ) ;
Period days_60 = Period.ofDays( 60 ) ;
Period days_90 = Period.ofDays( 90 ) ;
Вы можете добавлять и вычитать Period
до/из LocalDate
, в результате чего другого LocalDate
объекта. Вызовите LocalDate::plus
или LocalDate::minus
.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
LocalDate ago_30 = today.minus( days_30 ) ;
LocalDate ago_60 = today.minus( days_60 ) ;
LocalDate ago_90 = today.minus( days_90 ) ;
Вы более непосредственно вызываете LocalDate.minusDays
, но я подозреваю, что именованные объекты Period
сделают ваш код более читабельным и самодокументируемым.
LocalDate ago = today.minusDays( 30 ) ;
Похоже, вы запрашиваете базу данных. Начиная с JDBC 4.2 и выше, вы можете обмениваться объектами java.time с вашей базой данных. Для столбца базы данных типа данных, аналогичного стандартному стандарту SQL DATE
(значение только для даты, без времени суток и без часового пояса), используйте класс Java LocalDate
в Java.
myPreparedStatement.setObject( … , ago_30 ) ;
индексирование:
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытеснять неприятные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск для многих примеров и объяснений. Спецификация JSR 310.
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
ОБНОВЛЕНИЕ: библиотека Joda-Time теперь находится в режиме обслуживания. Его создатель, Стивен Колебурн, продолжал руководить реализацией JSR 310 и java.time, основываясь на уроках, извлеченных из Joda-Time. Я оставляю этот раздел нетронутым, как историю, но советую вместо этого использовать java.time.
Вот пример кода с использованием класса LocalDate библиотек Joda-Time 2.3.
LocalDate now = LocalDate.now();
LocalDate thirty = now.minusDays( 30 );
LocalDate sixty = now.minusDays( 60 );
LocalDate ninety = now.minusDays( 90 );
Дамп на консоль…
System.out.println( "now: " + now );
System.out.println( "thirty: " + thirty );
System.out.println( "sixty: " + sixty );
System.out.println( "ninety: " + ninety );
Когда беги…
now: 2014-03-26
thirty: 2014-02-24
sixty: 2014-01-25
ninety: 2013-12-26
Начало и окончание дня зависит от вашего часового пояса. Новый день в Париже наступает раньше, чем в Монреале.
По умолчанию класс LocalDate использует часовой пояс JVM по умолчанию для определения текущей даты. Кроме того, вы можете передать объект DateTimeZone.
LocalDate localDate = new LocalDate( DateTimeZone.forID( "Europe/Paris" ) );
Честно говоря, я рекомендую вам использовать Joda в качестве вашей библиотеки даты и времени. Он не только имеет превосходный API, но и понимает (т.е. имеет классы для) такие понятия, как периоды, продолжительность и т.д.
не уверен, откуда вы извлекаете данные, но для вычисления даты, которая называется 30 дней, вы можете использовать функцию добавления класса Calendar следующим образом:
c.add(Calendar.DAY_OF_MONTH, -30);//Предполагая, что c имеет тип java.util.Calendar
Теперь, чтобы выяснить, существует ли конкретная дата между сегодняшним днем и 30 днями назад, вы можете использовать функции before() и after(), чтобы выяснить, была ли дата до сегодняшнего дня, но после 30-го дня до сегодняшнего дня.
Используя календарь, мне нужно было подобрать дату минус N дней с текущей даты. Лучший способ:
public Date getDateVariation(Integer variation, Date currentDate) {
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.DAY_OF_YEAR, - (variation));
return c.getTime();
}
Вариация - это день, когда я хочу 10/30/60/120 дней.
private static Date daysAgo(int days) {
GregorianCalendar gc = new GregorianCalendar();
gc.add(Calendar.DATE, -days);
return gc.getTime();
}
код для получения будущей даты
public String futureDateByFourMonths() {
Date currentDate = new Date();
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.MONTH, 4);
c.add(Calendar.DATE, 1);
c.add(Calendar.HOUR, 1);
c.add(Calendar.MINUTE, 1);
c.add(Calendar.SECOND, 1);
Date currentDatePlusOne = c.getTime();
return dateFormat.format(currentDatePlusOne);
}
Просто измените месяц и минус количество месяцев
public String pastDateByFourMonths() {
Date currentDate = new Date();
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.MONTH, -4);
c.add(Calendar.DATE, -1);
c.add(Calendar.HOUR, 1);
c.add(Calendar.MINUTE, 1);
c.add(Calendar.SECOND, 1);
Date currentDatePlusOne = c.getTime();
return dateFormat.format(currentDatePlusOne);
}
Я нашел это решение где-то и изменил его для моих нужд