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.

È stato utile?

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));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top