Question

Je suis en train d'écrire une méthode simple utilitaire pour ajouter le numéro de unEntier de jours à un temps Joda instantanée. Voici mon premier coup de couteau.

/**
 * 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();
}

Cela fonctionne très bien pour la plupart, sauf si l'on considère l'exemple lorsque le nombre de jours supplémentaires vous emmène à travers la frontière BST / GMT. Voici un petit exemple.

public class DateAddTest {

/ **      * Zone à utiliser pour l'entrée et la sortie      * /     private static final DateTimeZone ZONE = DateTimeZone.forId ( "Europe / Londres");

/**
 * 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
}

}

Je pense que ce problème est que l'intervalle ne prend pas en acount le fait qu'il a traversé la frontière bst. Toute idée d'une meilleure façon de mettre en œuvre ce serait apprécié.

Était-ce utile?

La solution 3

Ceci est la solution qui a été choisie.

/**
* 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();
}

Autres conseils

Si vous voulez traiter avec des dates , ne pas utiliser instants. Je pense qu'il est correctement ajouter 48 heures à l'instant.

Utilisez un LocalDate place, puis la méthode plusDays.

Si vous voulez savoir l'instant où se produit n jours après l'instant spécifié, en même temps de la journée, nous pourrions sans doute travailler une façon de le faire (diviser l'instant en une et LocalTime <= >, faire avancer le réassembler puis LocalDateTime ou vérifier si fait ce que vous <=> voulez), mais vous avez besoin de comprendre ce que vous voulez arriver si l'heure se produit deux fois sur le nouveau jour, ou ne se produit pas tous.

EDIT: D'accord, donc vous devez travailler avec un instant. Est-ce que doivent être dans un fuseau horaire d'origine? Pourriez-vous utiliser UTC? Cela ôterait les questions DST. Sinon, qu'est-ce que vous voulez qu'il fasse en cas d'ambiguïté ou non-existence (par exemple à 00h30 avant chacune des transitions).

En supposant que le reste de votre code:

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));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top