Как проверить, равен ли объект Date вчера? - PullRequest
40 голосов
/ 09 июня 2010

Сейчас я использую этот код

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am"
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime())))                         //getDateFromLine() returns a Date Object that is always at 12pm
{...CODE

Должен быть более плавный способ проверить, является ли дата, возвращаемая методом getdateFromLine (), вчерашней датой. Важна только дата, а не время. Вот почему я использовал SimpleDateFormat. Заранее спасибо за помощь!

Ответы [ 8 ]

75 голосов
/ 09 июня 2010
Calendar c1 = Calendar.getInstance(); // today
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday

Calendar c2 = Calendar.getInstance();
c2.setTime(getDateFromLine(line)); // your date

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
  && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {

Это также работает для дат, таких как 1 января.

15 голосов
/ 24 ноября 2015

java.time

Использование java.time фреймворка, встроенного в Java 8

LocalDate now = LocalDate.now(); //2015-11-24
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23

yesterday.equals(now); //false
yesterday.equals(yesterday); //true

Официальное руководство по Oracle LocalDate состояния

Для сравнения следует использовать метод равенства.

Если вы работаете с такими объектами, как LocalDateTime, ZonedDateTime илиOffsetDateTime, вы можете конвертировать в LocalDate.

LocalDateTime.now().toLocalDate(); # 2015-11-24
14 голосов
/ 24 марта 2011

Я согласен с Эш Кимом, что библиотека Joda-Time - это путь, если вы хотите сохранить свое здоровье.

import org.joda.time.DateTime;

public static boolean dayIsYesterday(DateTime day) {
    DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1);
    DateTime inputDay = day.withTimeAtStartOfDay();

    return inputDay.isEqual(yesterday);
}

В этом примере, если DateTime day со вчерашнего дня, то dayIsYesterday(day) вернет true.

8 голосов
/ 14 июня 2014

Избегайте java.util.Date & .Calendar

Принятый ответ технически верен, но не оптимален. Классы java.util.Date и .Calendar печально известны своими проблемами. Избежать их. Используйте Joda-Time или новый java.time пакет (в Java 8).

Часовой пояс

Часовой пояс имеет решающее значение в работе даты и времени. Если вы игнорируете проблему, будет применен часовой пояс JVM по умолчанию. Лучше всегда указывать, а не полагаться на дефолт. Даже если вы хотите использовать значение по умолчанию, явно позвоните getDefault.

Начало дня определяется часовым поясом. В Берлине новый день наступает раньше, чем в Монреале. Поэтому для определения «сегодня» и «вчера» требуется часовой пояс.

Joda-Time

Пример кода в Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTime today = DateTime.now( timeZone ); 

Одним из способов определения вчерашнего дня является преобразование в объекты LocalDate. Другой способ, показанный здесь, состоит в том, чтобы представить «вчера» как промежуток времени. Мы определяем этот промежуток времени с первого момента вчерашнего дня до , но не включая первого момента сегодня. Этот подход называется «полуоткрытым», когда начало включительно , а окончание эксклюзивно .

Вычтите день, чтобы добраться до вчерашнего дня (или позавчера).

DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );

Преобразуйте целевой объект java.util.Date в объект DateTime Joda-Time. Примените часовой пояс к этому новому объекту, а не полагайтесь на применение часового пояса JVM по умолчанию. Технически часовой пояс здесь в этом случае не имеет значения, но включение часового пояса - хорошая привычка.

DateTime target = new DateTime( myJUDate, timeZone );

Проверьте, не приземляется ли цель на вчерашний интервал.

boolean isYesterday = yesterdayInterval.contains( target );

Очевидно, что этот подход с полуоткрытым промежутком времени работает не только с «вчера», таким как «эта неделя», «последний месяц» и т. Д.

Обновлено: Проект Joda-Time теперь находится в режиме обслуживания. Команда советует перейти на классы java.time. См. Решение java.time в правильном ответе Przemek .

2 голосов
/ 09 июня 2010

Вместо установки календаря попробуйте это:

public static void main(String[] args) {
    int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
    String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS);
    String currDate = dateFormat.format(date.getTime());
    String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS);
    System.out.println("Previous date: " + prevDate);
    System.out.println("Current date: " + currDate);
    System.out.println("Next date: " + nextDate);
  }

Это должно позволить вам двигаться вперед и назад по календарю

Затем вы можете просто сравнить getDateFromLine (line) со значением prevDate или любым другим.

1 голос
/ 09 июня 2010

Рекомендую использовать Joda-Time .Это чертовски лучше, чем предложения JDK.

0 голосов
/ 17 апреля 2015

Я нашел немного запутанным, когда я использую этот способ для проверки этого метода

 Calendar now = new GregorianCalendar(2000, 1, 1);
 now.add(Calendar.DATE, -1);

 SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
 System.out.println(format.format(now.getTime()));

я ожидаю напечатать 1999-12-31 , но на самом деле это 2001-1-31 Я думаю, Calendar.add () работает только с днем ​​в месяце.

Но настоящая ошибка - это способ создания объекта Calendar. В Календаре месяц начинается с 0 , значение переменной теперь равно 2001-2-1, я был настолько самонадеянным, что не печатал его. Когда я обнаружил, что что-то не так. Правильный способ создания календаря:

 Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1);

Календарь был настолько странным для бывшего программиста C #: (

0 голосов
/ 09 июня 2010

Примерно так:

         Calendar c1 = Calendar.getInstance();
         Date d1 = new Date(/* control time */);
         c1.setTime(d1);

        //current date
        Calendar c2 = Calendar.getInstance();

        int day1=c1.get(Calendar.DAY_OF_YEAR);
        int day2=c2.get(Calendar.DAY_OF_YEAR);

       //day2==day1+1 
...