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

Как проверить, соответствует ли дата объекту вчера?

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

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. Спасибо за вашу помощь заранее!

4b9b3361

Ответ 1

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 января.

Ответ 2

Я согласен с Ash Kim в том, что библиотека 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.

Ответ 3

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 учебник утверждает

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

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

LocalDateTime.now().toLocalDate(); # 2015-11-24

Ответ 4

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

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

Часовой пояс

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

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

Joda времени

Пример кода в 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() );

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

DateTime target = new DateTime( myJUDate, timeZone );

Проверьте, попадает ли цель в течение вчерашнего интервала.

boolean isYesterday = yesterdayInterval.contains( target );

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

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

Ответ 5

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

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 (строка) с показателем prevDate или любым другим, что вам нравится.

Ответ 6

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

Ответ 7

Что-то вроде этого примерно:

         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 

Ответ 8

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

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

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