Comment ajouter des minutes à ma date

110

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

Valeur des newTimechangements 2011-50-07 17:50 mais cela devrait l'être 07-01-2011 17:50.

Ça ajoute correctement les minutes mais ça change aussi de mois, je ne sais pas pourquoi!

junaidp
la source

Réponses:

193

Le problème pour vous est que vous utilisez mm. Vous devriez utiliser MM. MMest pour un mois et mmpour des minutes. Essayez avecyyyy-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));
Aravind Yarram
la source
merci, j'ai essayé ceci, la date arrive correctement, mais quand j'essaye de la changer en tant que chaîne, cela me donne le même mauvais résultat String newTime = df.format (afterAddingTenMins); il me donne 2011-50-07 17:50, je dois le convertir en chaîne, toute suggestion
junaidp
1
@junaidp vous avez utilisé le dernier bit de code, mais vous avez ignoré la première partie de la solution?
Carl
57

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
Alireza Alallah
la source
1
Pour les personnes travaillant avec une ancienne version de DateUtils, son présent dans le package ->org.apache.commons.lang.time.DateUtils
realPK
32

Méthode pratique pour mettre en œuvre 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;
}
jeznag
la source
26

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

Dans 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());
Marco Montel
la source
17

Ceci est incorrectement spécifié:

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

Vous utilisez les minutes au lieu du mois (MM)

Dawood
la source
6

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 remplacent les anciennes classes de date-heure gênantes telles que java.util.Dateet 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 rendre votre chaîne d'entrée conforme, remplacez l'ESPACE 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 en tant que LocalDateTimecar elle ne contient aucune information sur le fuseau horaire ou le décalage par rapport à UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Ajoutez dix minutes.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Voir le code en direct sur IdeOne.com .

Cela LocalDateTimen'a pas de fuseau horaire, donc cela ne représente pas un point sur la chronologie. Appliquez un fuseau horaire pour traduire à un moment réel. Indiquez un nom de fuseau horaire approprié dans le format continent/region, tels que America/Montreal, Africa/Casablancaou Pacific/Auckland, ou Asia/Karachi. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que ESTou ISTou PKTcar ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!).

ZonedDateTime

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

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

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

Anomalies

Pensez à ajouter ces dix minutes avant ou après l'ajout d'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 décalent l' heure de l'horloge murale .

Le fait d'ajouter 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.

Conseil: lorsque vous prévoyez un moment spécifique sur la chronologie, conservez toujours les informations de fuseau horaire . Ne perdez pas ces informations, comme vous l'avez fait avec vos données d'entrée. La valeur est-elle 12:34censé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 vu à travers l'objectif de UTC , extrayez un fichier Instant. La Instantclasse représente un moment sur la chronologie 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 le devez, vous pouvez convertir. Appel 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 anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , désormais 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?

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, YearQuarteret plus .

Basil Bourque
la source
4

Il y a une erreur dans le modèle de votre SimpleDateFormat. ça devrait être

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

utiliser ce format,

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

mm pour les minutes et MM pour le mois

Kushan
la source
2

Une fois que vous avez analysé la date, j'utilise cette fonction utilitaire 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, 1 jour n'est pas toujours 24 heures (ajustements de type heure d'été, secondes intercalaires, etc.), Calendarest recommandé pour cela.

David Miguel
la source
1

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)
Samuel Ivan
la source
2
Comment cette réponse améliore-t-elle celle de l'année dernière publiée par alireza alallah ? De plus, la question faisait référence aux minutes et non aux secondes.
Basil Bourque
1

Peut être fait sans les constantes (comme 3600000 ms soit 1h)

public static Date addMinutesToDate(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }

public static Date addHoursToDate(Date date, int hours) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, hours);
    return calendar.getTime();
}

exemple d'utilisation:

System.out.println(new Date());
System.out.println(addMinutesToDate(new Date(), 5));

Tue May 26 16:16:14 CEST 2020
Tue May 26 16:21:14 CEST 2020
Marek Manduch
la source
1
Ces terribles classes de date-heure ont été supplantées il y a des années par les classes java.time modernes , à compter de l'adoption de JSR 310.
Basil Bourque
-2

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

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
}
tawhid
la source
Date de Swift avait déjà une fonction intégrée similaire, par exemple Date (timeInterval:, depuis:)
Albert