Comment append des minutes à ma date

J’ai cet object de date:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm"); Date d1 = df.parse(interviewList.get(37).getTime()); 

valeur de d1 est Fri Jan 07 17:40:00 PKT 2011

J’essaie maintenant d’append 10 minutes à la date ci-dessus.

 Calendar cal = Calendar.getInstance(); cal.setTime(d1); cal.add(Calendar.MINUTE, 10); Ssortingng newTime = df.format(cal.getTime()); 

Valeur des changements de 2011-50-07 17:50 à 2011-50-07 17:50 mais il devrait être 07-01-2011 17:50 .

Il ajoute les minutes correctement mais cela change aussi le mois, je ne sais pas pourquoi!

Le problème pour vous est que vous utilisez mm . Vous devriez utiliser MM . MM est pour le mois et mm est pour les minutes. Essayez avec yyyy-MM-dd HH:mm

Autre approche:

Cela peut être aussi simple que cela (une autre option consiste à utiliser joda-time )

 static final long ONE_MINUTE_IN_MILLIS=60000;//millisecs Calendar date = Calendar.getInstance(); long t= date.getTimeInMillis(); Date afterAddingTenMins=new Date(t + (10 * ONE_MINUTE_IN_MILLIS)); 

Méthode pratique pour implémenter la réponse de @Pangea:

 /* * Convenience method to add a specified number of minutes to a Date object * From: http://stackoverflow.com/questions/9043981/how-to-add-minutes-to-my-date * @param minutes The number of minutes to add * @param beforeTime The time that will have minutes added to it * @return A date object with the specified number of minutes added to it */ private static Date addMinutesToDate(int minutes, Date beforeTime){ final long ONE_MINUTE_IN_MILLIS = 60000;//millisecs long curTimeInMs = beforeTime.getTime(); Date afterAddingMins = new Date(curTimeInMs + (minutes * ONE_MINUTE_IN_MILLIS)); return afterAddingMins; } 

vous pouvez utiliser la classe DateUtils dans le package org.apache.commons.lang3.time

 int addMinuteTime = 5; Date targetTime = new Date(); //now targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute 

Ceci est incorrectement spécifié:

 SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm"); 

Vous utilisez les minutes au lieu du mois (MM)

Pour éviter toute dépendance, vous pouvez utiliser java.util.Calendar comme suit:

  Calendar now = Calendar.getInstance(); now.add(Calendar.MINUTE, 10); Date teenMinutesFromNow = now.getTime(); 

En Java 8, nous avons une nouvelle API:

  LocalDateTime dateTime = LocalDateTime.now().plus(Duration.of(10, ChronoUnit.MINUTES)); Date tmfn = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); 

Il y a une erreur dans le modèle de votre SimpleDateFormat. CA devrait etre

 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 

utilisez ce format,

 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 

mm pour minutes et MM pour mois

tl; dr

 LocalDateTime.parse( "2016-01-23 12:34".replace( " " , "T" ) ) .atZone( ZoneId.of( "Asia/Karachi" ) ) .plusMinutes( 10 ) 

java.time

Utilisez les excellentes classes java.time pour le travail de date-heure. Ces classes remplacent les anciennes classes de date / heure gênantes telles que java.util.Date et java.util.Calendar .

ISO 8601

Les classes java.time utilisent par défaut les formats standard ISO 8601 pour parsingr / générer des chaînes de valeurs date-heure. Pour que votre chaîne d’entrée soit conforme, remplacez le SPACE au milieu par un T

 Ssortingng input = "2016-01-23 12:34" ; Ssortingng inputModified = input.replace( " " , "T" ); 

LocalDateTime

Analyser votre chaîne d’entrée en tant que LocalDateTime car il ne LocalDateTime aucune information sur le fuseau horaire ou l’offset-from-UTC.

 LocalDateTime ldt = LocalDateTime.parse( inputModified ); 

Ajouter dix minutes.

 LocalDateTime ldtLater = ldt.plusMinutes( 10 ); 

ldt.toSsortingng (): 2016-01-23T12: 34

ldtLater.toSsortingng (): 2016-01-23T12: 44

Voir le code en direct sur IdeOne.com .

Ce LocalDateTime n’a pas de fuseau horaire, donc il ne représente pas un point sur le scénario. Appliquez un fuseau horaire pour traduire à un moment réel. Spécifiez un nom de fuseau horaire approprié dans le format du continent/region , par exemple America/Montreal , Africa/Casablanca ou Pacific/Auckland ou Asia/Karachi . N’utilisez jamais les abréviations de 3 à 4 lettres telles que EST ou IST ou PKT car ce ne sont pas de véritables fuseaux horaires, non normalisés, et même pas uniques (!).

ZonedDateTime

Si vous connaissez le fuseau horaire prévu pour cette valeur, appliquez un ZoneId pour obtenir un ZonedDateTime .

 ZoneId z = ZoneId.of( "Asia/Karachi" ); ZonedDateTime zdt = ldt.atZone( z ); 

zdt.toSsortingng (): 2016-01-23T12: 44 + 05: 00 [Asia / Karachi]

Anomalies

Pensez à append ces dix minutes avant ou après avoir ajouté un fuseau horaire. Vous pouvez obtenir un résultat très différent en raison d’anomalies telles que l’heure d’été (DST) qui modifie l’ horloge .

Que vous ajoutiez les 10 minutes avant ou après l’ajout de la zone dépend de la signification de votre scénario et de vos règles métier.

Astuce: lorsque vous envisagez un moment spécifique sur la timeline, conservez toujours les informations de fuseau horaire . Ne perdez pas cette information, comme cela a été fait avec vos données d’entrée. Est-ce que la valeur 12:34 censée être midi au Pakistan ou midi en France ou midi au Québec? Si vous vouliez dire midi au Pakistan, dites-le en incluant au moins le décalage de l’UTC ( +05:00 ), et mieux encore, le nom du fuseau horaire ( Asia/Karachi ).

Instant

Si vous voulez le même moment vu à travers l’objective de l’ UTC , extrayez un Instant . La classe Instant représente un moment sur la timeline en UTC avec une résolution de nanosecondes (jusqu’à neuf (9) chiffres d’une fraction décimale).

 Instant instant = zdt.toInstant(); 

Convertir

Évitez autant que possible les vieilles classes fastidieuses. Mais si vous devez, vous pouvez convertir. Appelez de nouvelles méthodes ajoutées aux anciennes classes.

 java.util.Date utilDate = java.util.Date.from( instant ); 

À 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 telles que java.util.Date , Calendar et SimpleDateFormat .

Le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers 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 .

Où obtenir les classes java.time?

  • Java SE 8 et SE 9 et versions ultérieures
    • Intégré
    • Partie de l’API Java standard avec une implémentation intégrée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité java.time est transférée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus) pour Android en particulier.
    • Voir Comment utiliser… .

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval , YearWeek , YearQuarter , etc.

Une fois votre date analysée, j’utilise cette fonction utilitaire pour append des heures, des minutes ou des secondes:

 public class DateTimeUtils { private static final long ONE_HOUR_IN_MS = 3600000; private static final long ONE_MIN_IN_MS = 60000; private static final long ONE_SEC_IN_MS = 1000; public static Date sumTimeToDate(Date date, int hours, int mins, int secs) { long hoursToAddInMs = hours * ONE_HOUR_IN_MS; long minsToAddInMs = mins * ONE_MIN_IN_MS; long secsToAddInMs = secs * ONE_SEC_IN_MS; return new Date(date.getTime() + hoursToAddInMs + minsToAddInMs + secsToAddInMs); } } 

Soyez prudent lorsque vous ajoutez de longues périodes de temps, 1 jour n’est pas toujours 24 heures (ajustements de type heure avancée, secondes bissextiles, etc.), le Calendar est recommandé pour cela.

Travaillez pour moi DateUtils

 //import import org.apache.commons.lang.time.DateUtils 

  //Added and removed minutes to increase current range dates Date horaInicialCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaInicial.getTime()),-1) Date horaFinalCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaFinal.getTime()),1) 

Juste pour quiconque est intéressé. Je travaillais sur un projet iOS qui nécessitait des fonctionnalités similaires, donc j’ai fini par porter la réponse de @jeznag rapidement

 private func addMinutesToDate(minutes: Int, beforeDate: NSDate) -> NSDate { var SIXTY_SECONDS = 60 var m = (Double) (minutes * SIXTY_SECONDS) var c = beforeDate.timeIntervalSince1970 + m var newDate = NSDate(timeIntervalSince1970: c) return newDate }