web-dev-qa-db-fra.com

Comment ajouter des minutes à ma date

J'ai cet objet de date:

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

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

J'essaie maintenant d'ajouter 10 minutes à la date ci-dessus.

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

La valeur de newTime est remplacée par 2011-50-07 17:50.__, mais il devrait s'agir de 07-01-2011 17:50.

Il ajoute les minutes correctement mais il change également de mois, je ne sais pas pourquoi!

88
junaidp

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));
170
Aravind R. Yarram

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
37
Alireza Alallah

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;
}
30
jeznag

Ceci est incorrectement spécifié:

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

Vous utilisez les minutes au lieu du mois (MM)

16
Dawood

Afin d'é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());
14
Marco Montel

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 date-heure. Ces classes supplantent les anciennes classes de date-heure, telles que Java.util.Date et Java.util.Calendar.

ISO 8601

Les classes Java.time utilisent par défaut les formats ISO 8601 standard pour analyser/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

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

LocalDateTime

Analysez votre chaîne d’entrée avec la valeur LocalDateTime car elle ne contient aucune information sur le fuseau horaire ni sur le décalage par rapport à UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Ajouter dix minutes.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Voir code live sur IdeOne.com .

Cette LocalDateTime n'a pas de fuseau horaire. Par conséquent, pas représente un point sur la timeline. Appliquez un fuseau horaire pour traduire un moment réel. Spécifiez un nom de fuseau horaire correct } au format continent/region, tel que 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 elles sont pas des fuseaux horaires véritables, non normalisés et même uniques (!). 

ZonedDateTime

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

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

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

Les anomalies

Demandez-vous s'il faut ajouter ces dix minutes avant ou après l'ajout d'un fuseau horaire. Vous risquez d'obtenir un résultat très différent en raison d'anomalies telles que l'heure d'été (DST) qui décale le heure de l'horloge murale .

L'ajout des 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.

Conseil: Lorsque vous souhaitez un moment précis sur la timeline, conservez toujours les informations sur le fuseau horaire. Ne perdez pas cette information, comme avec vos données d'entrée. La valeur 12:34 est-elle 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 par rapport à UTC (+05:00) et, mieux encore, le nom du fuseau horaire (Asia/Karachi).

Instant

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

Instant instant = zdt.toInstant();

Convertir

Évitez les anciennes classes de date-heure gênantes autant que possible. Mais si vous devez, vous pouvez convertir. Appelez les nouvelles méthodes ajoutées aux anciennes classes. 

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

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

Le projet Joda-Time , désormais en mode mode de maintenance , conseille la migration vers Java.time.

Pour en savoir plus, consultez le Tutoriel 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é. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android

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

5
Basil Bourque

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

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

utiliser ce format,

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

mm pour les minutes et MM pour le mois

4
Kushan

Une fois que vous avez analysé la date, j'utilise cette fonction pour ajouter 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 ne correspond pas toujours à 24 heures (ajustements de type heure avancée, secondes intercalaires, etc.), Calendar est recommandé pour cela.

2
David Miguel

Travaille 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)
0
Samuel Ivan