Quelqu'un connaît-il un moyen simple d'utiliser le calendrier Java pour soustraire X jours d'une date?
Je n'ai trouvé aucune fonction qui me permette de soustraire directement X jours à une date en Java. Quelqu'un peut-il m'indiquer la bonne direction?
java
calendar
subtraction
fmsf
la source
la source
java.util.Calendar
maintenant héritées , supplantées par les classes java.time . Voir le didacticiel d'Oracle .Réponses:
Tiré de la documentation ici :
la source
Calendar.DAY_OF_MONTH
dans ce cas car il ne traitera pas le rouleau entre les mois comme vous le souhaiteriez. Utiliser à laCalendar.DAY_OF_YEAR
placeVous pouvez utiliser la
add
méthode et lui passer un nombre négatif. Cependant, vous pouvez également écrire une méthode plus simple qui n'utilise pas laCalendar
classe telle que la suivanteCela obtient la valeur d'horodatage de la date (millisecondes depuis l'époque) et ajoute le nombre approprié de millisecondes. Vous pouvez passer un entier négatif pour le paramètre jours pour effectuer la soustraction. Ce serait plus simple que la solution de calendrier "appropriée":
Notez que ces deux solutions modifient l'
Date
objet passé en paramètre plutôt que de renvoyer un tout nouveauDate
. Chaque fonction peut être facilement modifiée pour le faire dans l'autre sens si vous le souhaitez.la source
java.util.Calendar
maintenant héritées , supplantées par les classes java.time . Voir le didacticiel d'Oracle .La réponse d'Anson fonctionnera bien pour le cas simple, mais si vous comptez faire des calculs de date plus complexes, je vous recommande de consulter Joda Time . Cela vous facilitera la vie.
FYI in Joda Time vous pourriez faire
la source
tl; dr
Mieux vaut spécifier le fuseau horaire.
Détails
Les anciennes classes date-heure fournies avec les premières versions de Java, telles que
java.util.Date
/.Calendar
, se sont avérées gênantes, déroutantes et défectueuses. Évite-les.java.time
Java 8 et les versions ultérieures remplacent ces anciennes classes avec le nouveau framework java.time. Voir le didacticiel . Défini par JSR 310 , inspiré de Joda-Time , et prolongé par le projet ThreeTen-Extra . Le projet ThreeTen-Backport back-ports les classes vers Java 6 & 7; le projet ThreeTenABP sur Android.
La question est vague, pas claire si elle demande une date uniquement ou une date-heure.
LocalDate
Pour une date uniquement, sans heure du jour, utilisez la
LocalDate
classe. Notez qu'un fuseau horaire est crucial pour déterminer une date telle que «aujourd'hui».ZonedDateTime
Si vous vouliez dire une date-heure, utilisez la
Instant
classe pour obtenir un moment sur la chronologie en UTC . À partir de là, ajustez-vous à un fuseau horaire pour obtenir unZonedDateTime
objet.À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure héritées gênantes telles que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de cordes, pas besoin de
java.sql.*
classes.Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
edit: l'analyseur ne semble pas aimer le lien vers le Javadoc, donc le voici en texte brut:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
la source
Au lieu d'écrire mon propre
addDays
comme suggéré par Eli, je préférerais utiliserDateUtils
d' Apache . C'est pratique surtout lorsque vous devez l'utiliser à plusieurs endroits dans votre projet.L'API dit:
addDays(Date date, int amount)
Ajoute un nombre de jours à une date renvoyant un nouvel objet.
Notez qu'il renvoie un nouvel
Date
objet et ne modifie pas le précédent lui-même.la source
Cela peut être fait facilement par ce qui suit
la source
LocalDate
est beaucoup plus simple et plus appropriée.Quelqu'un a recommandé Joda Time donc - J'ai utilisé cette classe CalendarDate http://calendardate.sourceforge.net
C'est un projet quelque peu concurrent de Joda Time, mais beaucoup plus basique à seulement 2 classes. C'est très pratique et a très bien fonctionné pour ce dont j'avais besoin car je ne voulais pas utiliser un package plus grand que mon projet. Contrairement aux homologues Java, sa plus petite unité est le jour, donc c'est vraiment une date (ne pas l'avoir en quelques millisecondes ou quelque chose). Une fois que vous avez créé la date, tout ce que vous faites pour soustraire est quelque chose comme myDay.addDays (-5) pour revenir 5 jours en arrière. Vous pouvez l'utiliser pour trouver le jour de la semaine et des choses comme ça. Un autre exemple:
Et:
la source
Je crois qu'une manière propre et agréable d'effectuer la soustraction ou l'addition de n'importe quelle unité de temps (mois, jours, heures, minutes, secondes, ...) peut être obtenue en utilisant la classe java.time.Instant .
Exemple pour soustraire 5 jours de l'heure actuelle et obtenir le résultat comme Date:
Un autre exemple pour soustraire 1 heure et ajouter 15 minutes:
Si vous avez besoin de plus de précision, Instance mesure jusqu'à nanosecondes. Méthodes manipulant une partie nanoseconde:
De plus, gardez à l'esprit que la date n'est pas aussi précise qu'Instantané.
la source
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
La deuxième solution d'Eli Courtwright est fausse, elle devrait être:
la source
addDays
; sa solution est correcte. Si vous souhaitez soustraire des jours de la date, vous passez une valeur négative pourdays
.