2010-06-09 1 views
33

Сейчас я использую этот кодКак проверить, соответствует ли дата объекту вчера?

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

ответ

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

+3

Почему это работает 1 января? Разве год не будет отличаться от 31 декабря? – ebi

+4

Это работает, потому что Calendar.add изменяет временную метку даты смещением, вычисленным по типу поля и введенной сумме.Поэтому, независимо от исходной даты, она использует только метку времени (миллисекунды с 1 января 1970 года) и вычисляет новую дату на основе этой плюс/минус разницы, рассчитанной для ввода. Это также изменит год, даже если поле DAY_OF_YEAR. –

+1

Любой, кто видит этот поток, должен ссылаться на ответ @ Przemek, который использует 'java.time', который должен использоваться в предпочтении joda-time,' java.util.Date' и 'java.util.Calendar': http: //stackoverflow.com/a/33893147/1322243 – liltitus27

2

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

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 или как хочешь.

1

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

0

Нечто подобное грубо:

  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 
+0

Следует также сравнить значения года. –

+0

о да, я забыл о году. – Inv3r53

11

Я согласен с 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.

+0

В классах и методах, связанных с полночью, в Joda-Time были основаны на ошибочной идее. Они теперь устарели от Joda-Time 2.3. Вместо этого используйте метод ['withTimeAtStartOfDay'] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()). –

+0

Кроме того, вы должны [указать часовой пояс] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html), а не полагаться на JVM по умолчанию, поскольку это имеет решающее значение для определения «сегодня» и «вчера». –

+0

сейчас = "1/07/2016". previous = "12/06/1980". В вашем предыдущемFromYesteray будет установлено значение true, в то время как тема стартера спросила, как вы можете проверить, является ли дата «вчера». – Dogcat

7

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

0

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

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. В календаре, месяц начинается с , значение переменной теперь равно 2001-2-1, я был таким самонадеянным, чтобы не печатать его. Когда я нашел что-то не так. правильный способ создать календарь:

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

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

10

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 LocalDatetutorial состояние

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

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

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

Я предлагаю всегда передавать необязательный ['ZoneId'] (http://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html) в [' LocalDate.now'] (http: //docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#now-java.time.ZoneId-) вместо того, чтобы неявно ссылаться на текущий часовой пояс JVM. Это значение по умолчанию может меняться в любой момент даже во время выполнения. Например: «LocalDate.now (ZoneId.of (« Америка/Монреаль »))' –