2013-10-11 2 views
6

Con JodaTime, senza utilizzare le funzioni "più" o "meno" e utilizzando le righe minime di codice, come posso impostare una nuova data senza modificare l'ora?Modificare la data senza modificare il tempo

Il mio primo tentativo è stato quello di memorizzare le parti 'tempo' del DateTime in separati int s utilizzando getHoursOfDay() e getMinutesOfHour() ecc - quindi creare un nuovo DateTime con la data richiesta e impostare le ore, i minuti ei secondi di nuovo. Ma questo metodo è piuttosto goffo e mi chiedevo se esistesse un metodo meno dettagliato per farlo, idealmente con una sola riga di codice.

Ad esempio:

22/05/2013 13:40:02 >>>>30/08/2014 13:40:02

+0

ho votato per chiudere in primo luogo come opinione-based. La via "più semplice" per risolvere un problema è soggettiva. Se invece volevi dire "* non so come cambiare solo il giorno/mese/anno puoi mostrarmi? *", Quindi modifica la tua domanda per chiarire. In tal caso, includi anche il tuo miglior sforzo. –

+2

"Più semplice" è cambiato in "Più semplice", che è molto meno soggettivo –

+0

Per chiarire, conosco già un paio di modi per farlo, ma sono prolissi e goffi. Sto cercando di vedere se qualcuno ha a disposizione un approccio davvero ottimista. –

risposta

1

La risposta precedentemente accettata è stata rimossa dal moderatore, poiché contiene solo il collegamento a javadoc. Ecco la versione modificata.


Si potrebbe fare così

DateTime myDate = ... 
myDate.withDate(desiredYear, desiredMonth, desiredDayOfMonth); 

JavaDoc è qui: DateTime.withDate(int year, int month, int dayOfMonth)

2

È JodaTime un must? Il modo di base per farlo è 1. estrai solo il tempo dal timestamp. 2. Aggiungi questo al solo oggi


long timestamp = System.currentTimeMillis(); //OK we have some timestamp 
long justTime = timestamp % 1000 * 60 * 60 * 24;// just tiem contains just time part 


long newTimestamp = getDateFromSomeSource();//now we have date from some source 
justNewDate = newTimestamp - (newTimestamp % 1000 * 60 * 60 * 24);//extract just date 

result = justNewDate + justTime; 

Qualcosa di simile.

+0

I miei precedenti tentativi di risolvere questo problema sono stati altrettanto dettagliati del tuo suggerimento, tuttavia hai risolto il problema utilizzando un metodo completamente inaspettato, quindi +1 per quello :) –

+0

Questo non tiene conto dell'ora legale. – SpaceTrucker

1

uso withFields come questo:

new DateTime().withFields(new LocalDate(2000,1,1)) 

Questo imposterà tutti i campi di tempo data del DateTime a coloro che sono contenuti nel LocalDate - anno, mese e giorno in questo caso. Questo funzionerà con qualsiasi implementazione ReadablePartial come YearMonth per esempio.