Избегайте 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 .