L'aggiunta di un numero di giorni per un immediato JodaTime
Domanda
Sto cercando di scrivere un semplice metodo di utilità per l'aggiunta di numero aninteger di giorni per un tempo Joda istante. Qui è il mio primo tentativo.
/**
* Adds a number of days specified to the instant in time specified.
*
* @param instant - the date to be added to
* @param numberOfDaysToAdd - the number of days to be added to the instant specified
* @return an instant that has been incremented by the number of days specified
*/
public static Instant addNumberOfDaysToInstant(final Instant instant, final int numberOfDaysToAdd) {
Days days = Days.days(numberOfDaysToAdd);
Interval interval = new Interval(instant, days);
return interval.getEnd().toInstant();
}
Questo funziona bene per la maggior parte, tranne se si considera l'esempio quando il numero di giorni aggiunti vi porta in tutto il / GMT di confine BST. Ecco un piccolo esempio.
public class DateAddTest {
/ ** * Zone di utilizzare per l'input e l'output * / private static finale DateTimeZone ZONE = DateTimeZone.forId ( "Europe / London");
/**
* Formatter used to translate Instant objects to & from strings.
*/
private static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT).withZone(ZONE);
/**
* Date format to be used
*/
private static final String DATE_FORMAT = "dd/MM/yyyy";
public static void main(String[] args) {
DateTime dateTime = FORMATTER.parseDateTime("24/10/2009");
Instant toAdd = dateTime.toInstant();
Instant answer = JodaTimeUtils.addNumberOfDaysToInstant(toAdd, 2);
System.out.println(answer.toString(FORMATTER)); //25/10/2009
}
}
Credo che questo problema è perché l'intervallo non tiene acount il fatto che essa ha attraversato il confine BST. Tutte le idee di un modo migliore per implementare questo sarebbe apprezzato.
Soluzione 3
Questa è la soluzione che è stato scelto.
/**
* Zone to use for input and output
*/
private static final DateTimeZone ZONE = DateTimeZone.forId("Europe/London");
/**
* Adds a number of days specified to the instant in time specified.
*
* @param instant - the date to be added to
* @param numberOfDaysToAdd - the number of days to be added to the instant specified
* @return an instant that has been incremented by the number of days specified
*/
public static Instant addNumberOfDaysToInstant(final Instant instant, final int numberOfDaysToAdd) {
return instant.toDateTime(ZONE).withFieldAdded(DurationFieldType.days(), numberOfDaysToAdd).toInstant();
}
Altri suggerimenti
Se si vuole affrontare date , non utilizzare istanti. Ho il sospetto che è correttamente l'aggiunta di 48 ore per l'istante.
Utilizzare un LocalDate
invece, e quindi il metodo plusDays
.
Se volete sapere l'istante che si verifica n giorni dopo l'istante specificato, alla stessa ora del giorno, potremmo senza dubbio lavorare fuori un modo di fare che (dividere l'istante in un LocalTime
e <= >, far avanzare la LocalDateTime
e rimontare, oppure verificare se <=> fa ciò che si vuole), ma è necessario capire cosa si vuole che accada se si verifica il tempo originale due volte il nuovo giorno, o non si verifica a tutti.
EDIT: Okay, quindi è necessario lavorare con un istante. Ha a che essere in un fuso orario originale? Potreste usare UTC? Ciò avrebbe tolto i problemi DST. Se no, che cosa vuoi che faccia in caso di ambiguità o non-esistenza (ad esempio alle 12.30 prima di ciascuna delle transizioni).
Supponendo che il resto del codice:
public static void main(String[] args) {
DateTime dateTime = FORMATTER.parseDateTime("24/10/2009");
Instant pInstant = dateTime.withFieldAdded(DurationFieldType.days(),2).toInstant();
System.out.println("24/10/2009 + 2 Days = " + pInstant.toString(FORMATTER));
}