¿Cómo verificar si una fecha Object es igual a ayer?

En este momento estoy usando este código

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 

Tiene que haber una forma más fácil de verificar si la fecha devuelta por getdateFromLine () es la fecha de ayer. Solo la fecha importa, no el tiempo. Es por eso que utilicé SimpleDateFormat. ¡Gracias por tu ayuda con anticipación!

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

Esto también funcionará para fechas como el 1 de enero.

Estoy de acuerdo con Ash Kim en que la biblioteca Joda-Time es el camino a seguir si quieres preservar tu cordura.

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

En este ejemplo, si el day DateTime es de ayer, dayIsYesterday(day) devolverá true .

java.time

Usando el marco java.time integrado en 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 

Estados tutoriales oficiales de Oracle LocalDate

El método equals debe usarse para las comparaciones.

Si está trabajando con objetos como LocalDateTime , ZonedDateTime o OffsetDateTime , puede realizar la conversión a LocalDate .

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

Evita java.util.Date y .Calendar

La respuesta aceptada es técnicamente correcta pero no óptima. Las clases java.util.Date y .Calendar son notoriamente problemáticas. Evítales. Utilice Joda-Time o el nuevo paquete java.time (en Java 8).

Zona horaria

La zona horaria es crítica en el trabajo de fecha y hora. Si ignora el problema, se aplicará la zona horaria predeterminada de la JVM. Una mejor práctica es especificar siempre en lugar de confiar en el valor predeterminado. Incluso cuando quiera el valor predeterminado, llame explícitamente a getDefault .

El comienzo del día está definido por la zona horaria. Un nuevo día amanece antes en Berlín que en Montreal. Entonces la definición de “hoy” y “ayer” requiere un huso horario.

Joda-Time

Código de ejemplo en Joda-Time 2.3.

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

Una forma de determinar ayer es convirtiendo a objetos LocalDate. Otra forma, que se muestra aquí, es representar “ayer” como un lapso de tiempo. Definimos ese lapso como ir desde el primer momento de ayer hasta el primer momento de hoy, pero sin incluirlo . Este enfoque se llama “medio abierto”, donde el comienzo es inclusivo y el final es exclusivo .

Reste un día para llegar a ayer (o el día anterior).

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

Convierta su objeto java.util.Date de destino a un objeto Joda-Time DateTime. Aplique una zona horaria a ese nuevo objeto, en lugar de confiar en la aplicación de la zona horaria predeterminada de JVM. Técnicamente, el huso horario aquí en este caso es irrelevante, pero incluir un huso horario es un buen hábito.

 DateTime target = new DateTime( myJUDate, timeZone ); 

Prueba si el objective aterriza dentro del intervalo de ayer.

 boolean isYesterday = yesterdayInterval.contains( target ); 

Obviamente, este enfoque con un lapso de tiempo medio abierto funciona con algo más que “ayer”, como “esta semana”, “el mes pasado”, y así sucesivamente.

Actualizado: El proyecto Joda-Time ahora está en modo de mantenimiento. El equipo aconseja la migración a las clases java.time. Vea la solución java.time en la respuesta correcta de Przemek .

En lugar de configurar el calendario, intente esto:

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

Esto debería permitirle avanzar y retroceder a lo largo del calendario

Luego, simplemente puede comparar la getDateFromLine (línea) con el valor prevDate o lo que quiera.

Te recomiendo que consideres usar Joda-Time . Es mucho mejor que las ofertas de JDK.

Me ha parecido un poco confuso cuando uso esta forma para probar este método

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

mi expectativa es imprimir 1999-12-31 , pero el real es 2001-1-31 . Supongo que Calendar.add () solo trata el día en el mes.

Pero el error real es la forma en que creo el objeto Calendario. En Calendario, el mes comienza con 0 , el valor de la variable ahora es 2001-2-1, estaba tan engreído como para no imprimirlo. Cuando descubrí que algo andaba mal. la forma correcta de crear un calendario es:

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

El calendario era tan extraño para un ex progtwigdor de C # 🙁

Algo así aproximadamente:

  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