Comment incrémenter une date d'un jour en Java?


562

Je travaille avec une date dans ce format: yyyy-mm-dd .

Comment incrémenter cette date d'un jour?


10
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 date
SimpleDateFormat sdf = new SimpleDateFormat("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

50
@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).

public class DateUtil
{
    public static Date addDays(Date date, int days)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, days); //minus number would decrement the days
        return cal.getTime();
    }
}

Pour ajouter un jour, selon la question posée, appelez-le comme suit:

String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);

4
Pour info, les anciennes classes de date-heure terriblement 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 versions ultérieures. Voir Tutoriel par Oracle .
Basil Bourque

80

java.time

Sur Java 8 et versions ultérieures, le package java.time rend cela à peu près automatique. ( Tutoriel )

En supposant une Stringentrée et une sortie:

import java.time.LocalDate;

public class DateIncrementer {
  static public String addOneDay(String date) {
    return LocalDate.parse(date).plusDays(1).toString();
  }
}

3
FYI, à la fois ZonedDateDateTimeet OffsetDateTimeaussi ont plusDayset minusDaysméthodes ainsi queLocalDate
Basil Bourque

@BasilBourque Bien sûr, mais les informations disponibles dans la question sont celles d'un LocalDate.
Daniel C.Sobral

2
@DanielCSobral Yep. Il suffit d'ajouter des liens pour l'édification de vos lecteurs. Pas une critique.
Basil Bourque

65

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:

addDays (Date date, int amount): Ajoute un nombre de jours à une date renvoyant un nouvel objet.

Notez qu'il renvoie un nouvel objet Date et ne modifie pas le précédent lui-même.


59
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );

48

Construisez un objet Calendar et utilisez la méthode add (Calendar.DATE, 1);


43

Jetez un œil à Joda-Time ( https://www.joda.org/joda-time/ ).

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));

3
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.
MetroidFan2002

Pour un exemple de code plus détaillé utilisant Joda-Time, voir ma réponse à une question similaire, Comment ajouter un jour à une date? .
Basil Bourque

2
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!


40

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 pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");

// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);

1
Je suppose que tu januaryFirst.plusDays(1)ne voulais pas date.plusDays(1).
TeWu

Ceci n'est pris en charge que sur android O developer.android.com/reference/java/time/package-summary.html
Subho

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();

1
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
Mickey Perlstein

Pour info, les anciennes classes de date-heure terriblement 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 versions ultérieures. Voir Tutoriel par Oracle .
Basil Bourque

Meilleure réponse, droit au but. Je suis d'accord avec Mickey, ne
tenez

23
Date today = new Date();               
SimpleDateFormat formattedDate = new SimpleDateFormat("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é.


1
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 Date
LocalDate destDate = sourceDate.plusDays(1); // Adding a day to source date.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // Setting date format

String destDate = destDate.format(formatter));  // End date

Si vous souhaitez utiliser SimpleDateFormat , faites-le comme ceci.

String sourceDate = "2017-05-27";  // Start date

SimpleDateFormat sdf = new SimpleDateFormat("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 add
String 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 = new Date (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.
dvaey

15

Depuis Java 1.5 TimeUnit.DAYS.toMillis (1) me semble plus propre.

SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Date day = dateFormat.parse(string);
// add the day
Date dayAfter = new Date(day.getTime() + TimeUnit.DAYS.toMillis(1));

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


11

Dans java 8, vous pouvez utiliser java.time.LocalDate

LocalDate parsedDate = LocalDate.parse("2015-10-30"); //Parse date from String
LocalDate addedDate = parsedDate.plusDays(1);   //Add one to the day field

Vous pouvez convertir en java.util.Dateobjet comme suit.

Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

Vous pouvez formater LocalDateen une chaîne comme suit.

String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

11

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

Merci



7

Il suffit de passer la date en chaîne et le nombre de jours suivants

 private String getNextDate(String givenDate,int noOfDays) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        String nextDaysDate = null;
    try {
        cal.setTime(dateFormat.parse(givenDate));
        cal.add(Calendar.DATE, noOfDays);

       nextDaysDate = dateFormat.format(cal.getTime());

    } catch (ParseException ex) {
        Logger.getLogger(GR_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
    dateFormat = null;
    cal = null;
    }

    return nextDaysDate;

}

7

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 = new SimpleDateFormat("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()));

Imprime:

1970-12-31
1971-01-01
1970-12-31

Il n'y a pas de réponse acceptée et j'ai senti qu'il y avait une confusion globale si d'autres champs étaient également mis à jour.
terrmith

7
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender

4
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.

  public LocalDate asLocalDate(Date date) {
      Instant instant = date.toInstant();
      ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
      return zdt.toLocalDate();
  }

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);

1
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.


3

Si vous utilisez Java 8 java.time.LocalDateet java.time.format.DateTimeFormatterpouvez rendre ce travail assez simple.

public String nextDate(String date){
      LocalDate parsedDate = LocalDate.parse(date);
      LocalDate addedDate = parsedDate.plusDays(1);
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-mm-dd");
      return addedDate.format(formatter); 
}

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":

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 Date myNewDate = DateUtils.addDays(myDate, 4);
 Date yesterday = DateUtils.addDays(myDate, -1);
 String formatedDate = sdf.format(myNewDate);  

5
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();

String DayAfterTommorow aura lieu le 2019-05-11


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:

  1. Convertir en chaîne et revenir avec SimpleDateFormat : il s'agit d'une solution inefficace.
  2. Convertir en LocalDate : vous toutes les informations de l'heure.
  3. Convertir en LocalDateTime : cela implique plus d'étapes et vous devez vous soucier du fuseau horaire.
  4. Convertir à l'époque avec Date.getTime () : c'est efficace mais vous calculez en millisecondes.

Pensez à utiliser java.time.Instant :

Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);

1
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 = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);

14
fyi, Date.setDate () est déconseillé
Kelly S. French

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.
Ole VV
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.