Si vous utilisez Java 8 ou une version plus récente, vous pouvez utiliser la nouvelle API date / heure. Voir cette réponse: stackoverflow.com/a/23910924/1115554
micha
4
new DateTime (). plusDays (1) .toDate () ???
Pietro
Réponses:
686
Quelque chose comme ça devrait faire l'affaire:
String dt ="2008-01-01";// Start dateSimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd");Calendar c =Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE,1);// number of days to add
dt = sdf.format(c.getTime());// dt is now the new date
@Esko, c.roll (Calendar.DATE, true) ne fera pas rouler le mois le dernier jour du mois.
Sam Hasler
18
@Ammar c'est une mauvaise idée si vous n'avez rien compris
niccolo m.
13
Je vais citer quelques JavaDocs ... Calendar.DATE: "... Ceci est un synonyme de DAY_OF_MONTH." Je souhaite que les JavaDocs clarifient que cela incrémenterait des champs plus grands (comme le mois et l'année). Calendar.roll "Ajoute ou soustrait (haut / bas) une seule unité de temps sur le champ horaire donné sans modifier les champs plus grands" .. Encore une fois, "les champs plus grands" sont vagues mais cela semble cohérent avec le commentaire de Sam. Je souhaite qu'il y ait un StackOverflow pour réparer les anciens JavaDocs.
jcalfee314
4
les gars, malheureusement, il est tout à fait inutile d'ajouter des jours en utilisant DATE, DAY_OF_MONTH ou même DAY_OF_YEAR - ils sont tous incrémentés par module. Donc, considérant le calendrier du 31-12-1970, ajoutez (DAY_OF_YEAR, 1) ou roll (), mais roll () appelle finalement add (), donnera 01-01-1970. Je suppose que la seule façon correcte est de régler l'heure avec des millisecondes. Quant à moi, je n'utilise plus jamais la classe Calendar.
Dmitry Gryazin
14
@Bagzerg: Vous vous trompez . add()roulera la date. Voir sur ideone .
Jean Hominal
212
Java semble être bien derrière le huit-ball par rapport à C #. Cette méthode utilitaire montre la façon de faire dans Java SE 6 en utilisant la méthode Calendar.add (probablement le seul moyen facile).
publicclassDateUtil{publicstaticDate addDays(Date date,int days){Calendar cal =Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days);//minus number would decrement the daysreturn cal.getTime();}}
Pour ajouter un jour, selon la question posée, appelez-le comme suit:
String sourceDate ="2012-02-29";SimpleDateFormat format =newSimpleDateFormat("yyyy-MM-dd");Date myDate = format.parse(sourceDate);
myDate =DateUtil.addDays(myDate,1);
Vous pouvez supprimer les appels de l'analyseur pour construire le DateTime. Utilisez DateTime date = new DateTime (dateString); Ensuite, nextDay est ISODateTimeFormat.date (). Print (date.plusDays (1)); Voir joda-time.sourceforge.net/api-release/org/joda/time/… pour plus d'informations.
Pour info… Le projet Joda-Time est désormais en mode maintenance, et conseille la migration vers les classes java.time . Les deux efforts ont été dirigés par le même homme, Stephen Colebourne. Ils partagent donc des concepts similaires et la migration n'est pas difficile.
Basil Bourque
40
Veuillez noter que cette ligne ajoute 24 heures:
d1.getTime()+1*24*60*60*1000
mais cette ligne ajoute un jour
cal.add(Calendar.DATE,1);
Les jours avec un changement d'heure d'été (25 ou 23 heures), vous obtiendrez des résultats différents!
Java 8 a ajouté une nouvelle API pour travailler avec les dates et les heures.
Avec Java 8, vous pouvez utiliser les lignes de code suivantes:
// parse date from yyyy-mm-dd patternLocalDate januaryFirst =LocalDate.parse("2014-01-01");// add one dayLocalDate januarySecond = januaryFirst.plusDays(1);
@Subho Pour Android avant le 26, voir le projet ThreeTenABP qui adapte le ThreeTen-Backport , un back-port si la plupart des fonctionnalités en temps Java à Java 6 et Java 7.
Basil Bourque
29
vous pouvez utiliser Simple java.util lib
Calendar cal =Calendar.getInstance();
cal.setTime(yourDate);
cal.add(Calendar.DATE,1);
yourDate = cal.getTime();
Cette réponse reproduit le contenu de plusieurs réponses, y compris la réponse acceptée d'il y a trois ans. Veuillez supprimer votre réponse ou modifier pour ajouter de la valeur.
Basil Bourque
3
cette réponse est plus propre, n'analyse pas la date au milieu. la «réponse acceptée» est trop compliquée. il est bon que vous ayez ajouté le vôtre, ne tenez pas compte de la remarque automatisée de basilic
Meilleure réponse, droit au but. Je suis d'accord avec Mickey, ne
tenez
23
Date today =newDate();SimpleDateFormat formattedDate =newSimpleDateFormat("yyyyMMdd");Calendar c =Calendar.getInstance();
c.add(Calendar.DATE,1);// number of days to add String tomorrow =(String)(formattedDate.format(c.getTime()));System.out.println("Tomorrows date is "+ tomorrow);
Cela donnera la date de demain. c.add(...)les paramètres peuvent être modifiés de 1 à un autre nombre pour un incrément approprié.
vous pouvez faire quelque chose comme c.setTime (objet Date) pour définir une date spécifique avant de l'ajouter.
Linh Lino
Je souhaite que les packages java par défaut rendent la gestion des dates moins compliquée ... Je veux dire, c'est tellement pénible chaque fois que vous voulez gérer des dates ... juste une diatribe ...
Shn_Android_Dev
1
@Shn_Android_Dev Les classes java.time intégrées à Java 8 et ultérieur supplantent les terribles anciennes classes date-heure et répondent à votre souhait. Portage arrière également vers Java 6/7 et Android antérieur dans les projets ThreeTen-Backport et ThreeTenABP . Pas besoin de toujours utiliser Dateou Calendarencore.
Basil Bourque
19
Si vous utilisez Java 8 , faites-le comme ceci.
LocalDate sourceDate =LocalDate.of(2017,Month.MAY,27);// Source DateLocalDate destDate = sourceDate.plusDays(1);// Adding a day to source date.DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy-MM-dd");// Setting date formatString destDate = destDate.format(formatter));// End date
Si vous souhaitez utiliser SimpleDateFormat , faites-le comme ceci.
String sourceDate ="2017-05-27";// Start dateSimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd");Calendar calendar =Calendar.getInstance();
calendar.setTime(sdf.parse(sourceDate));// parsed date and setting to calendar
calendar.add(Calendar.DATE,1);// number of days to addString destDate = sdf.format(calendar.getTime());// End date
Non, la question demandait une valeur de date uniquement et non une date-heure. N'utilisez donc pas la LocalDateclasse LocalDateTime.
Basil Bourque
1
Votre réponse reprend le contenu d'au moins quatre autres réponses. Veuillez expliquer en quoi la vôtre ajoute de la valeur au-delà de celles-ci, ou supprimez-la avant de collecter les votes négatifs.
Basil Bourque
16
long timeadj =24*60*60*1000;Date newDate =newDate(oldDate.getTime ()+timeadj);
Cela prend le nombre de millisecondes depuis l'époque de oldDate et ajoute 1 jour de millisecondes, puis utilise le constructeur public Date () pour créer une date en utilisant la nouvelle valeur. Cette méthode vous permet d'ajouter 1 jour, ou n'importe quel nombre d'heures / minutes, pas seulement des jours entiers.
Ce n'est probablement pas ce que voulait OP; il ne prend pas en compte les ajustements de type heure d'été, les secondes intercalaires, etc.
mrec
1
L'heure d'été doit être gérée par le fuseau horaire / locale. Mon exemple montrait comment incrémenter par petites durées. Lors de l'incrémentation par jours, les secondes intercalaires peuvent être un problème, mais lors de l'ajout d'heures, elles sont moins probables, bien qu'elles soient toujours possibles.
Cela crée une valeur date-heure où la question demande une date uniquement. Je suggère une approche beaucoup plus sage est la LocalDateclasse dans les classes java.time pour Java 8 et versions ultérieures, et le back-port vers Java 6 et Java 7 trouvé dans le projet ThreeTen-Backport .
Basil Bourque
14
En Java 8, la manière la plus simple de procéder est:
C'est très simple, essayer d'expliquer en un mot simple. obtenez la date d'aujourd'hui comme ci-dessous
Calendar calendar =Calendar.getInstance();System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE,1);
Maintenant, définissez un jour à l'avance avec cette date par la méthode calendar.add qui prend (constante, valeur). Ici, la constante peut être DATE, heures, min, sec, etc. et la valeur est la valeur de constante. Comme pour un jour, la constante à venir est Calendar.DATE et sa valeur est 1 car nous voulons une valeur à un jour.
System.out.println(calendar.getTime());// print modified date which is la date de demain
Si vous souhaitez ajouter une seule unité de temps et que vous vous attendez à ce que d'autres champs soient également incrémentés, vous pouvez utiliser en toute sécurité la méthode add. Voir l'exemple ci-dessous:
SimpleDateFormat simpleDateFormat1 =newSimpleDateFormat("yyyy-MM-dd");Calendar cal =Calendar.getInstance();
cal.set(1970,Calendar.DECEMBER,31);System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE,1);System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE,-1);System.out.println(simpleDateFormat1.format(cal.getTime()));
Merci de vouloir contribuer. Cependant, cela figure déjà dans plusieurs des autres réponses, donc je ne vois vraiment aucun intérêt ... À part cela, à mon humble avis, personne ne devrait utiliser la Calendarclasse mal conçue et dépassée depuis longtemps en 2019.
Ole VV
6
Si vous utilisez Java SE 8 ou supérieur, vous devez utiliser la nouvelle API Date / Heure
int days =7;LocalDate dateRedeemed =LocalDate.now();DateTimeFormatter formatter =DateTimeFormatter.ofPattern("dd/MM/YYYY");String newDate = dateRedeemed.plusDays(days).format(formatter);System.out.println(newDate);
Si vous devez convertir de java.util.Dateà java.time.LocalDate, vous pouvez utiliser cette méthode.
Si vous utilisez une version antérieure à Java SE 8, je vous conseille d'utiliser Joda-Time
Joda-Time fournit un remplacement de qualité pour les classes de date et d'heure Java et est la bibliothèque standard de facto de date et d'heure pour Java avant Java SE 8
int days =7;DateTime dateRedeemed =DateTime.now();DateTimeFormatter formatter =DateTimeFormat.forPattern("dd/MM/uuuu");String newDate = dateRedeemed.plusDays(days).toString(formatter);System.out.println(newDate);
Votre modèle pour la java.timepièce est incorrect. Il devrait être dd/MM/uuuuéquivalent à celui de JodaTime.
TiiJ7
5
Utilisez l' DateFormatAPI pour convertir la chaîne en un objet Date, puis utilisez l' CalendarAPI pour en ajouter un jour. Faites-moi savoir si vous voulez des exemples de code spécifiques, et je pourrai mettre à jour ma réponse.
Encore plus simple: supprimez le formateur et utilisez-le simplement toString()pour produire la chaîne au format aaaa-MM-jj (et si vous insistez, rappelez-vous que ce mmn'est que quelques minutes alors que MMc'est le mois).
Ole VV
3
Vous pouvez utiliser ce package à partir de "org.apache.commons.lang3.time":
Suggérer un Datecours en 2018 est un mauvais conseil. Les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir Tutorial by Oracle . Voir d'autres réponses en utilisant la LocalDateclasse.
Basil Bourque
Oui, LocalDate EST la meilleure façon de le faire,
Shaheed
Cependant, certains frameworks comme jsf ont quelques petits problèmes d'intégration avec l'API Time, vous devez donc parfois utiliser Date; plus environnement java <8
Lucke
1
@Lucke La plupart des fonctionnalités de java.time ont été portées en retour sur Java 6 et 7 dans le projet ThreeTen-Backport . Plus adapté aux anciens Android dans le projet ThreeTenABP . Donc, vraiment pas besoin de toucher ces horribles vieilles classes de date et d'heure. De nombreux cadres ont été mis à jour. Mais pas tout. Donc, si vous devez interagir avec l'ancien code non encore mis à jour vers java.time , écrivez votre nouveau code dans java.time et convertissez-le en / à partir des anciens types en appelant de nouvelles méthodes de conversion ajoutées aux anciennes classes.
Basil Bourque
1
Ce code ignore la question cruciale du fuseau horaire . Pour un moment donné, la date varie dans le monde par zone. La SimpleDateFormatclasse injecte malheureusement un fuseau horaire, appliquant implicitement le fuseau par défaut actuel de la JVM. Ainsi, les résultats de ce code varieront en fonction de la valeur par défaut actuelle - et cette valeur par défaut peut changer à tout moment pendant l' exécution.
Basil Bourque
3
C'est simple en fait. Un jour contient 86400000 milliSecondes. Donc, vous obtenez d'abord l'heure actuelle en millisecondes du système en utilisant System.currentTimeMillis()puis ajoutez les 84000000 milliSecondes et utilisez la Dateclasse pour générer un format de date pour les millisecondes.
Exemple
String Today = new Date(System.currentTimeMillis()).toString();
La chaîne aujourd'hui sera 2019-05-9
String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();
String Tommorow sera le 2019-05-10
String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();
Ce code utilise la Dateclasse terrible qui a été remplacée il y a des années par les classes modernes java.time . Tellement plus simple à utiliser simplement:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Basil Bourque
2
Clarifions le cas d'utilisation: vous voulez faire l'arithmétique du calendrier et commencer / terminer avec un java.util.Date .
Quelques approches:
Convertir en chaîne et revenir avec SimpleDateFormat : il s'agit d'une solution inefficace.
Convertir en LocalDate : vous toutes les informations de l'heure.
Convertir en LocalDateTime : cela implique plus d'étapes et vous devez vous soucier du fuseau horaire.
Convertir à l'époque avec Date.getTime () : c'est efficace mais vous calculez en millisecondes.
Ne mélangez jamais les terribles classes héritées telles que Dateles classes java.time modernes telles que Instant. Les classes java.time supplantent entièrement les classes héritées. Plus précisément, Instantremplace java.util.Date.
Basil Bourque
1
Ne répond pas à la question. Vous utilisez des classes représentant un moment (une date avec une heure dans le contexte d'un décalage ou d'une zone). Mais la question porte sur la date uniquement sans heure et sans fuseau horaire. Voir la bonne réponse de Sobral et la bonne réponse de micha.
Basil Bourque
0
Date newDate =newDate();
newDate.setDate(newDate.getDate()+1);System.out.println(newDate);
Sur mon ordinateur, il semble fonctionner à travers une frontière d'un mois. Après Sun Apr 30 16:25:33 CEST 2017vient Mon May 01 16:25:33 CEST 2017. C'est toujours une solution découragée. Non seulement la méthode est déconseillée pour une bonne raison, mais en 2017, nous avons de très bonnes alternatives à la Dateclasse.
Réponses:
Quelque chose comme ça devrait faire l'affaire:
la source
add()
roulera la date. Voir sur ideone .Java semble être bien derrière le huit-ball par rapport à C #. Cette méthode utilitaire montre la façon de faire dans Java SE 6 en utilisant la méthode Calendar.add (probablement le seul moyen facile).
Pour ajouter un jour, selon la question posée, appelez-le comme suit:
la source
java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par Oracle .java.time
Sur Java 8 et versions ultérieures, le package java.time rend cela à peu près automatique. ( Tutoriel )
En supposant une
String
entrée et une sortie:la source
ZonedDateDateTime
etOffsetDateTime
aussi ontplusDays
etminusDays
méthodes ainsi queLocalDate
LocalDate
.Je préfère utiliser DateUtils d'Apache. Vérifiez ceci http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . C'est pratique surtout lorsque vous devez l'utiliser à plusieurs endroits dans votre projet et que vous ne voudriez pas écrire votre méthode de doublure pour cela.
L'API dit:
Notez qu'il renvoie un nouvel objet Date et ne modifie pas le précédent lui-même.
la source
la source
Construisez un objet Calendar et utilisez la méthode add (Calendar.DATE, 1);
la source
Jetez un œil à Joda-Time ( https://www.joda.org/joda-time/ ).
la source
Veuillez noter que cette ligne ajoute 24 heures:
mais cette ligne ajoute un jour
Les jours avec un changement d'heure d'été (25 ou 23 heures), vous obtiendrez des résultats différents!
la source
Java 8 a ajouté une nouvelle API pour travailler avec les dates et les heures.
Avec Java 8, vous pouvez utiliser les lignes de code suivantes:
la source
januaryFirst.plusDays(1)
ne voulais pasdate.plusDays(1)
.vous pouvez utiliser Simple java.util lib
la source
java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par Oracle .Cela donnera la date de demain.
c.add(...)
les paramètres peuvent être modifiés de 1 à un autre nombre pour un incrément approprié.la source
Date
ouCalendar
encore.Si vous utilisez Java 8 , faites-le comme ceci.
Si vous souhaitez utiliser SimpleDateFormat , faites-le comme ceci.
la source
LocalDate
classeLocalDateTime
.Cela prend le nombre de millisecondes depuis l'époque de oldDate et ajoute 1 jour de millisecondes, puis utilise le constructeur public Date () pour créer une date en utilisant la nouvelle valeur. Cette méthode vous permet d'ajouter 1 jour, ou n'importe quel nombre d'heures / minutes, pas seulement des jours entiers.
la source
Depuis Java 1.5 TimeUnit.DAYS.toMillis (1) me semble plus propre.
la source
LocalDate
classe dans les classes java.time pour Java 8 et versions ultérieures, et le back-port vers Java 6 et Java 7 trouvé dans le projet ThreeTen-Backport .En Java 8, la manière la plus simple de procéder est:
la source
Instant.now().plus( 1 , ChronoUnit.DAYS )
?Dans java 8, vous pouvez utiliser
java.time.LocalDate
Vous pouvez convertir en
java.util.Date
objet comme suit.Vous pouvez formater
LocalDate
en une chaîne comme suit.la source
C'est très simple, essayer d'expliquer en un mot simple. obtenez la date d'aujourd'hui comme ci-dessous
Maintenant, définissez un jour à l'avance avec cette date par la méthode calendar.add qui prend (constante, valeur). Ici, la constante peut être DATE, heures, min, sec, etc. et la valeur est la valeur de constante. Comme pour un jour, la constante à venir est Calendar.DATE et sa valeur est 1 car nous voulons une valeur à un jour.
System.out.println(calendar.getTime());// print modified date which is
la date de demainMerci
la source
Apache Commons a déjà ce DateUtils.addDays (Date date, int entier) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java .util.Date,% 20int% 29 que vous utilisez ou vous pouvez utiliser le JodaTime pour le rendre plus propre.
la source
Il suffit de passer la date en chaîne et le nombre de jours suivants
la source
Si vous souhaitez ajouter une seule unité de temps et que vous vous attendez à ce que d'autres champs soient également incrémentés, vous pouvez utiliser en toute sécurité la méthode add. Voir l'exemple ci-dessous:
Imprime:
la source
la source
Calendar
classe mal conçue et dépassée depuis longtemps en 2019.Si vous utilisez Java SE 8 ou supérieur, vous devez utiliser la nouvelle API Date / Heure
Si vous devez convertir de
java.util.Date
àjava.time.LocalDate
, vous pouvez utiliser cette méthode.Si vous utilisez une version antérieure à Java SE 8, je vous conseille d'utiliser Joda-Time
la source
java.time
pièce est incorrect. Il devrait êtredd/MM/uuuu
équivalent à celui de JodaTime.Utilisez l'
DateFormat
API pour convertir la chaîne en un objet Date, puis utilisez l'Calendar
API pour en ajouter un jour. Faites-moi savoir si vous voulez des exemples de code spécifiques, et je pourrai mettre à jour ma réponse.la source
Si vous utilisez Java 8
java.time.LocalDate
etjava.time.format.DateTimeFormatter
pouvez rendre ce travail assez simple.la source
toString()
pour produire la chaîne au format aaaa-MM-jj (et si vous insistez, rappelez-vous que cemm
n'est que quelques minutes alors queMM
c'est le mois).Vous pouvez utiliser ce package à partir de "org.apache.commons.lang3.time":
la source
Date
cours en 2018 est un mauvais conseil. Les anciennes classes de date-heure gênantes telles quejava.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir Tutorial by Oracle . Voir d'autres réponses en utilisant laLocalDate
classe.SimpleDateFormat
classe injecte malheureusement un fuseau horaire, appliquant implicitement le fuseau par défaut actuel de la JVM. Ainsi, les résultats de ce code varieront en fonction de la valeur par défaut actuelle - et cette valeur par défaut peut changer à tout moment pendant l' exécution.C'est simple en fait. Un jour contient 86400000 milliSecondes. Donc, vous obtenez d'abord l'heure actuelle en millisecondes du système en utilisant
System.currentTimeMillis()
puis ajoutez les 84000000 milliSecondes et utilisez laDate
classe pour générer un format de date pour les millisecondes.Exemple
String Today = new Date(System.currentTimeMillis()).toString();
La chaîne aujourd'hui sera 2019-05-9
String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();
String Tommorow sera le 2019-05-10
String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();
String DayAfterTommorow aura lieu le 2019-05-11
la source
Date
classe terrible qui a été remplacée il y a des années par les classes modernes java.time . Tellement plus simple à utiliser simplement:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Clarifions le cas d'utilisation: vous voulez faire l'arithmétique du calendrier et commencer / terminer avec un java.util.Date .
Quelques approches:
Pensez à utiliser java.time.Instant :
la source
Date
les classes java.time modernes telles queInstant
. Les classes java.time supplantent entièrement les classes héritées. Plus précisément,Instant
remplacejava.util.Date
.la source
Sun Apr 30 16:25:33 CEST 2017
vientMon May 01 16:25:33 CEST 2017
. C'est toujours une solution découragée. Non seulement la méthode est déconseillée pour une bonne raison, mais en 2017, nous avons de très bonnes alternatives à laDate
classe.