Ajout d'un nombre de jours à un instant JodaTime
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é.
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));
}