Подтвердить что ты не робот

Узнать последние 30 дней, 60 дней и 90 дней в java

Как получить последние 30/60/90 дней записей с указанной даты в java?

У меня есть записи с receivedDate. Я хочу получить записи за последние 30 или 60 или 90 дней с полученной даты. Как его решить?

4b9b3361

Ответ 1

Используйте 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();

Ответ 2

ТЛ; др

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.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

Похоже, вы запрашиваете базу данных. Начиная с JDBC 4.2 и выше, вы можете обмениваться объектами java.time с вашей базой данных. Для столбца базы данных типа данных, аналогичного стандартному стандарту SQL DATE (значение только для даты, без времени суток и без часового пояса), используйте класс Java LocalDate в Java.

myPreparedStatement.setObject( … , ago_30 ) ;

индексирование:

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

О java.time

Инфраструктура 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 времени

ОБНОВЛЕНИЕ: библиотека 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" ) );

Ответ 3

Честно говоря, я рекомендую вам использовать Joda в качестве вашей библиотеки даты и времени. Он не только имеет превосходный API, но и понимает (т.е. имеет классы для) такие понятия, как периоды, продолжительность и т.д.

Ответ 4

не уверен, откуда вы извлекаете данные, но для вычисления даты, которая называется 30 дней, вы можете использовать функцию добавления класса Calendar следующим образом:

c.add(Calendar.DAY_OF_MONTH, -30);//Предполагая, что c имеет тип java.util.Calendar

Теперь, чтобы выяснить, существует ли конкретная дата между сегодняшним днем ​​и 30 днями назад, вы можете использовать функции before() и after(), чтобы выяснить, была ли дата до сегодняшнего дня, но после 30-го дня до сегодняшнего дня.

Ответ 5

Используя календарь, мне нужно было подобрать дату минус 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 дней.

Ответ 6

private static Date daysAgo(int days) {
    GregorianCalendar gc = new GregorianCalendar();
    gc.add(Calendar.DATE, -days);
    return gc.getTime();
}

Ответ 7

код для получения будущей даты

    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);

}

Я нашел это решение где-то и изменил его для моих нужд