2009-05-26 16 views
13

Duplicar posibles:
How to determine the date one day prior to a given date in Java?Obtener Día anterior

Si tengo un objeto Java.Util.Date, ¿cuál es la mejor manera de conseguir un objeto que representa las 24 horas en el pasado de ¿eso?

+2

Dupe: http://stackoverflow.com/questions/745443 –

+0

Puede que no sea una estafa, si la pregunta fue 24 horas y no un día. Una aclaración estaría en orden. – Yishai

+2

Debe tener en cuenta que debido al horario de verano, hay días que tienen 23 o 25 horas, por lo que "día anterior" no es lo mismo que "24 horas antes". Las fechas son desagradables. –

Respuesta

38

Uso de Java 1.6 java.util.Calendar.add:

public static Date subtractDay(Date date) { 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.add(Calendar.DAY_OF_MONTH, -1); 
    return cal.getTime(); 
} 

Otros sugieren el uso de Joda Time, que actualmente es JSR 310, y más tarde se debe incluir en Java en sí.

+1

Quitaría el contexto del método, no agrega nada y me avergüenza por su falta de flexibilidad. –

+0

esperando esto en 1.6 ... las fechas siempre han sido una pesadilla mía en Java – miguel

-4

reste 1000 * 60 * 60 * 24 de la hora y cree una nueva fecha.

Date yesterday = new Date(d.getTime() - (1000*60*60*24)); 
+0

Esto producirá el resultado incorrecto durante los interruptores de horario de verano –

+0

en realidad, el calendario sería incorrecto. La pregunta fue 24 horas en el pasado, no ayer al mismo tiempo. – user101884

+0

Casi con seguridad la pregunta en sí misma era incorrecta, es decirel OP no pensó en este caso especial, y no está de acuerdo con este punto con el título "obtener el día anterior" –

-4
int dayInMs = 1000 * 60 * 60 * 24; 
    Date previousDay = new Date(olddate.getTime() - dayInMs); 

personalmente si hay una gran cantidad de cálculos de hora/fecha, me gustaría ir con Joda-time.

+0

Código incorrecto, que estará 1 hora apagado en los interruptores de horario de verano –

+0

Como usted mismo notó en los comentarios anteriores, Nathaniel probablemente desconoce la diferencia, por lo que necesita re decir lo que realmente quiere decir. –

+0

Veo ... Di más peso al texto ("24 horas") en lugar del título ("día anterior"). –

0

Lo importante que debe recordar es que la clase Date debe representar cualquier punto en el tiempo mientras que la clase Calendar se usa para manipular esos puntos en el tiempo. Por último, SimpleDateFormat los representará como cadenas.

Por lo tanto, la mejor manera es utilizar la clase Calendario para calcular la nueva fecha para usted. Esto asegurará que se tengan en cuenta los caprichos (horario de verano, años bisiestos y similares).

Supongo que realmente no desea encontrar las "24 horas anteriores", pero en realidad quiero una nueva instancia de fecha que represente "esta vez ayer". De cualquier manera, puede solicitar una fecha a la instancia de Calendar 24 horas antes de otro o 1 día antes.

El horario de verano es un gran ejemplo. El Reino Unido 'saltó hacia adelante' el 26 de marzo de 2009. Por lo tanto, 1 día antes de las 3:00 a.m. el 26.Mar.2009 debería rendir 3.00 a.m. 25.Mar.2009 pero 24 Hrs. Anteriores rendirán 2.00 a.m.

public class DateTests extends TestCase { 
    private static String EXPECTED_SUMMER_TIME = "2009.Mar.29 03:00:00"; 
    private static String EXPECTED_SUMMER_TIME_LESS_DAY = "2009.Mar.28 03:00:00"; 
    private static String EXPECTED_SUMMER_TIME_LESS_24_HRS = "2009.Mar.28 02:00:00"; 
    private static String EXPECTED_SUMMER_TIME_LESS_FURTHER_24_HRS = "2009.Mar.27 02:00:00"; 

    public void testSubtractDayOr24Hours() { 

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MMM.dd HH:mm:SS"); 

    Calendar calendar = Calendar.getInstance(); 

    // Create our reference date, 3.00 a.m. on the day the clocks go forward (they 'went' forward at 02.00) 
    calendar.clear(); 
    calendar.set(2009, 2, 29, 3, 0); 

    Date summerTime = calendar.getTime(); // Sun Mar 29 03:00:00 BST 2009 
    String formattedSummerTime = formatter.format(summerTime); 
    calendar.add(Calendar.DAY_OF_MONTH, -1); 

    // Our reference date less 'a day' 
    Date summerTimeLessADay = calendar.getTime(); // Sat Mar 28 03:00:00 GMT 2009 
    String formattedSummerTimeLessADay = formatter.format(summerTimeLessADay); 

    // reset the calendar instance to the reference day 
    calendar.setTime(summerTime); 

    // Our reference date less '24 hours' (is not quite 24 hours) 
    calendar.add(Calendar.HOUR, -24); 
    Date summerTimeLess24Hrs = calendar.getTime(); // Sat Mar 28 02:00:00 GMT 2009 
    String formattedSummerTimeLess24Hrs = formatter.format(summerTimeLess24Hrs); 

    // Third date shows that taking a further 24 hours from yields expected result 
    calendar.add(Calendar.HOUR, -24); 
    Date summerTimeLessFurther24Hrs = calendar.getTime(); // Fri Mar 27 02:00:00 GMT 2009 
    String formattedSummerTimeLessFurther24Hrs = formatter.format(summerTimeLessFurther24Hrs); 

    // reset the calendar once more to the day before 
    calendar.setTime(summerTimeLess24Hrs); 

    // Take a 'day' from the Sat will yield the same result as date 03 because Daylight Saving is not a factor 
    calendar.add(Calendar.DAY_OF_MONTH, -1); 
    Date summerTimeLessFurtherDay = calendar.getTime(); // Fri Mar 27 02:00:00 GMT 2009 
    String formattedSummerTimeLessFurtherDay = formatter.format(summerTimeLessFurtherDay); 

    assert(formattedSummerTime.equals(EXPECTED_SUMMER_TIME)); 
    assert(formattedSummerTimeLessADay.equals(EXPECTED_SUMMER_TIME_LESS_DAY)); 
    assert(formattedSummerTimeLess24Hrs.equals(EXPECTED_SUMMER_TIME_LESS_24_HRS)); 

    assert(formattedSummerTimeLessFurther24Hrs.equals(EXPECTED_SUMMER_TIME_LESS_FURTHER_24_HRS)); 

    // This last test proves that taking 24 hors vs. A Day usually yields the same result 
    assert(formattedSummerTimeLessFurther24Hrs.equals(formattedSummerTimeLessFurtherDay)); 

    } 
} 

Para las funciones de fecha de la prueba, wwwdot-timeanddate-punto-com es un gran recurso.

Cuestiones relacionadas