L'ajout d'un nombre de jours JodaTime Instant
Je suis en train d'écrire un utilitaire simple méthode pour ajouter aninteger nombre de jours Joda time instant. 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 vous prenez, par exemple, lorsque le nombre de jours supplémentaires vous emmène à travers la BST /GMT limite. Voici un petit exemple.
public class DateAddTest {
/**
* Zone à utiliser pour l'entrée et la sortie
*/
private static final 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
}
}
Je pense que ce problème est dû à l'intervalle de ne pas prendre en compte le fait qu'il a traversé le bst de la frontière. Toute idée d'une meilleure façon de mettre en œuvre ce serait appréciée.
- Quel fuseau horaire vous attendez-vous à l'Instant argument à être créé à partir de? Il cohérent? Le calcul est vide de sens sans que la valeur d'être pris en compte en quelque sorte, puisque vous êtes incapable d'utiliser le correctif original proposé par Jon.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez traiter avec dates, ne pas utiliser les instants. Je soupçonne que c'est correctement ajout de 48 heures pour l'instant.
Utiliser un
LocalDate
à la place, puis leplusDays
méthode.Si vous voulez connaître l'instant où se produit n jours après l'instant, à la même heure de la journée, nous pourrions sans aucun doute un moyen de le faire (split à l'instant dans un
LocalDate
et unLocalTime
, avance leLocalDate
et puis remonter, ou de vérifier siLocalDateTime
fait ce que vous voulez), mais vous devez savoir ce que vous voulez arriver si le temps se produit deux fois sur le nouveau jour, ou ne pas se produire du tout.EDIT: Ok, donc vous avez besoin de travailler avec un instant. Est-ce que doivent être dans un fuseau horaire d'origine? Pourriez-vous utiliser l'UTC? Pour enlever les questions de l'heure d'été. Si non, que voulez-vous faire en cas d'ambiguïté ou de la non-existence (par exemple, à 12h30 devant chacune des transitions).
En supposant que le reste de votre code:
C'est la solution qui a été choisie.