Избегайте java.util.Date & .Calendar
accepted answer технически правильно, но меньше, чем оптимальный. Классы java.util.Date и .Calendar, как известно, хлопотны. Избежать их. Используйте либо Joda-Time, либо новый java.time package (на 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());
Конвертировать целевой объект java.util.Date в объект DateDime Joda-Time. Примените часовой пояс к этому новому объекту, а не полагайтесь на применение часовой пояс JVM по умолчанию. Технически часовой пояс здесь в этом случае не имеет значения, но с часовым поясом является хорошей привычкой.
DateTime target = new DateTime(myJUDate, timeZone);
Испытание, если цель земли находится в пределах интервала вчера.
boolean isYesterday = yesterdayInterval.contains(target);
Очевидно, что этот подход с полуоткрытым промежутком времени работает с более, чем просто «вчера», например, «на этой неделе», «в прошлом месяце», и так далее.
Обновлено: Проект Joda-Time теперь находится в режиме обслуживания. Команда советует перейти на классы java.time. См. Решение java.time в файле correct Answer by Przemek.
Почему это работает 1 января? Разве год не будет отличаться от 31 декабря? – ebi
Это работает, потому что Calendar.add изменяет временную метку даты смещением, вычисленным по типу поля и введенной сумме.Поэтому, независимо от исходной даты, она использует только метку времени (миллисекунды с 1 января 1970 года) и вычисляет новую дату на основе этой плюс/минус разницы, рассчитанной для ввода. Это также изменит год, даже если поле DAY_OF_YEAR. –
Любой, кто видит этот поток, должен ссылаться на ответ @ Przemek, который использует 'java.time', который должен использоваться в предпочтении joda-time,' java.util.Date' и 'java.util.Calendar': http: //stackoverflow.com/a/33893147/1322243 – liltitus27