Cómo comprobar si un Objeto date es igual a ayer?

Ahora mismo 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 ser una suave manera de comprobar si la fecha devuelta por getdateFromLine() es la fecha de ayer. Sólo la fecha en la que importa, no el tiempo. Es por eso que he utilizado SimpleDateFormat.
Gracias por su ayuda de antemano!

InformationsquelleAutor tzippy | 2010-06-09

8 Kommentare

  1. 75
    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 funciona para fechas como el día 1 de enero.

    • ¿Por qué hace este trabajo para el día 1 de enero? No el año sea diferente para el 31 de diciembre?
    • Funciona porque el Calendario.agregar los cambios de la fecha y hora de la fecha por un desplazamiento calculado a partir del tipo de campo y el importe ingresado. Así que no importa la fecha original, sólo utiliza la marca de tiempo (milisegundos desde el 1 de enero de 1970) y calcula la nueva función de la fecha en que más/menos la diferencia calculada para la entrada. En efecto esto va a cambiar el año, aunque el campo es DAY_OF_YEAR.
    • toda persona que vea este hilo debería referirse a @Przemek la respuesta, que utiliza java.time, que deben ser utilizados con preferencia a la joda-time, java.util.Date, y java.util.Calendar: stackoverflow.com/a/33893147/1322243
  2. 15

    java.tiempo

    Utilizando java.time marco de trabajo basado 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

    Oficial de Oracle LocalDate tutorial estados

    El método equals debe ser utilizado para las comparaciones.

    Si estás trabajando con objetos tales como LocalDateTime, ZonedDateTime, o OffsetDateTime, usted puede convertir a LocalDate.

    LocalDateTime.now().toLocalDate(); # 2015-11-24
    • Sugiero siempre pasando el opcional ZoneId LocalDate.now, en lugar de confiar implícitamente en la JVM actual de la zona horaria predeterminada. Que por defecto se puede cambiar en cualquier momento, incluso durante el tiempo de ejecución. Como este: LocalDate.now( ZoneId.of( "America/Montreal" ) )
  3. 14

    Estoy de acuerdo con las Cenizas de Kim que el Joda-El Tiempo de la biblioteca es el camino a seguir si desea conservar su 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 DateTime day es de ayer, a continuación, dayIsYesterday(day) volverá true.

    • La medianoche relacionadas con las clases y métodos en Joda-Time se basa en una idea errónea. Ahora están en desuso como de Joda-Time 2.3. En lugar de utilizar el método de withTimeAtStartOfDay.
    • También, usted debe generalmente especificar la zona horaria, en lugar de depender de la JVM del defecto, ya que es fundamental para la determinación de «hoy» y «ayer».
    • ahora = «1/07/2016». anterior = «12/06/1980». Su previousFromYesteray se establece en verdadero, mientras que el tema de arranque le preguntó acerca de cómo se puede comprobar si una fecha es «ayer».
    • buen punto. Editado. 2011, me ha algunos que explicar.
    • incluso hay más margen de mejora 🙂 usar DateTime que tiene sentido, pero para esta tarea en particular LocalDate de JodaTime hará perfecto.
  4. 8

    Evitar java.util.Fecha & .Calendario

    La aceptado respuesta es técnicamente correcto, pero menos que óptima. El java.util.Fecha y .Calendario de clases son muy molestos. Evitarlos. El uso de cualquiera de Joda-El Tiempo o la nueva java.paquete de tiempo (en Java 8).

    Zona Horaria

    De la zona horaria es fundamental en la fecha y hora de trabajo. Si usted ignorar el tema, de la JVM zona horaria predeterminada será aplicada. Una mejor práctica es siempre especificar en lugar de depender de forma predeterminada. Incluso cuando usted desea que el defecto, llamar explícitamente getDefault.

    El inicio de la jornada se define por el tiempo de la zona. Un nuevo día amanece antes en Berlín que en Montreal. De modo que la definición de «hoy» y «ayer» requiere un tiempo de la zona.

    Joda Tiempo

    Código de ejemplo en Joda-Time 2.3.

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

    Una forma de determinar que ayer por la conversión a LocalDate objetos. De otra manera, se muestra aquí, es para representar el «ayer» como un lapso de tiempo. Definimos que abarcan como ir desde el primer momento de ayer hasta pero no incluyendo el primer momento de hoy. Este enfoque se conoce como «semi-abierto», donde el principio es incluido y el final es exclusivo.

    Resta un día para llegar hasta el día de ayer (o el día antes).

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

    Convertir su destino java.util.Fecha objeto a una Joda de Tiempo objeto DateTime. Aplique una zona horaria a ese nuevo objeto, en lugar de confiar en la aplicación de la JVM la zona horaria predeterminada. Técnicamente la zona horaria en este caso es irrelevante, pero incluyendo una zona horaria es un buen hábito.

    DateTime target = new DateTime( myJUDate, timeZone );

    Prueba si el destino de las tierras dentro del intervalo de ayer.

    boolean isYesterday = yesterdayInterval.contains( target );

    Obviamente este enfoque con la mitad de abrir lapso de tiempo que se trabaja con algo más que «ayer», tales como «esta semana», «mes pasado», y así sucesivamente.

    Actualizado: La Joda-Time proyecto se encuentra ahora en modo de mantenimiento. El equipo asesora a la migración a java.clases de tiempo. Ver el java.tiempo de solución en el Respuesta correcta por Przemek.

  5. 2

    En lugar de ajustar 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 permitir que usted se mueva hacia adelante y hacia atrás a lo largo del calendario

    A continuación, usted puede comparar simplemente el getDateFromLine(línea) a la prevDate valor o lo que quieras.

  6. 0

    He encontrado un poco de confundir al utilizar este modo a prueba 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 espera es imprimir 1999-12-31,pero el valor real es de 2001-1-31
    Supongo Calendario.agregar() sólo se ocupan de día en el mes.

    Pero el error real es la manera de crear el objeto Calendario.
    En el Calendario ,el mes de inicio con 0,la variable ahora que el valor de 2001-2-1, yo estaba tan autoconciencia como no se va a imprimir.cuando me enteré de que algo estaba mal.
    forma correcta de crear un Calendario es :

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

    El Calendario fue tan extraño para un ex programador de C#: (

  7. 0

    Algo como esto más o menos:

             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 
    • También debe comparar los valores de año así.
    • oh sí, me olvidé de todo el año.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea