2009-05-26 10 views
13

Eventuali duplicati:
How to determine the date one day prior to a given date in Java?Get Giorno Precedente

Se ho un oggetto Java.Util.Date, qual è il modo migliore per ottenere un oggetto che rappresenta le 24 ore in passato di vero?

+2

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

+0

Potrebbe non essere un problema, se la domanda era 24 ore e non un giorno. Un chiarimento sarebbe in ordine. – Yishai

+2

È necessario tenere presente che a causa dell'ora legale, ci sono giorni che hanno 23 o 25 ore, quindi "giorno precedente" non è la stessa cosa di "24 ore prima". Le date sono affari cattivi. –

risposta

38

Utilizzo di 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(); 
} 

Altri suggeriscono usando Joda Time, che è attualmente JSR 310, e dovrebbe poi essere incluso in Java stesso.

+1

rimuoverei il contesto del metodo - non aggiunge nulla e mi fa rabbrividire per la sua mancanza di flessibilità. –

+0

attendo con ansia questo in 1.6 ... le date sono sempre state un mio bugbear in Java – miguel

-4

sottrarre 1000 * 60 * 60 * 24 dall'ora e creare una nuova data.

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

Ciò produrrà il risultato errato durante gli interruttori di ora legale –

+0

effettivamente, il Calendario sarebbe errato. La domanda era 24 ore in passato, non ieri allo stesso tempo. – user101884

+0

Quasi certamente la domanda in sé era sbagliata, ad es.l'OP non ha pensato a questo caso speciale - e non è d'accordo su questo punto con il titolo "get previous day" –

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

Personalmente se ci sono un sacco di calcoli di data/ora, mi piacerebbe andare con Joda-time.

+0

Codice errato, che sarà di 1 ora di sconto sull'ora legale –

+0

Come notato nei commenti sopra, Nathaniel probabilmente non è a conoscenza di la differenza, quindi ha bisogno di ritirare ciò che in realtà significa. –

+0

Vedo ... Ho dato più peso al testo ("24 ore") anziché al titolo ("giorno precedente"). –

0

La cosa importante da ricordare è che la classe Date dovrebbe rappresentare qualsiasi punto nel tempo mentre la classe Calendar viene utilizzata per manipolare quei punti nel tempo. Infine, SimpleDateFormat li rappresenterà come stringhe.

Quindi, il modo migliore è utilizzare la classe Calendar per calcolare la nuova data per te. Ciò garantirà che siano considerati i capricci (Daylight Saving, Leap Years e simili).

Suppongo che tu non voglia veramente trovare "24 ore precedenti" ma in realtà desideri una nuova istanza di data che rappresenti "questa volta ieri" - in entrambi i casi, puoi chiedere all'istanza di Calendar una data 24 ore prima di un altro o 1 giorno prima.

Il risparmio di luce diurna è un ottimo esempio. Il Regno Unito "è avanzato" il 26 marzo 2009. Quindi, 1 giorno prima delle 3:00 am. il 26.Mar.2009 dovrebbe fruttare 3.00a.m. 25. Marzo 2009 ma 24 ore prima renderà 2.00am

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

    } 
} 

Per le funzioni di data test, wwwdot-timeanddate-dot-com è una grande risorsa.

Problemi correlati