So füge ich meinem Date Minuten hinzu

110

Ich habe dieses Datumsobjekt:

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

Wert von d1 ist Fri Jan 07 17:40:00 PKT 2011

Jetzt versuche ich, dem obigen Datum 10 Minuten hinzuzufügen.

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

Wert der newTimeÄnderungen an, 2011-50-07 17:50 aber es sollte sein 07-01-2011 17:50.

Es fügt Minuten korrekt hinzu, ändert aber auch den Monat, weiß nicht warum!

junaidp
quelle

Antworten:

193

Das Problem für Sie ist, dass Sie verwenden mm. Sie sollten verwenden MM. MMist für Monat und mmist für Minuten. Versuche es mityyyy-MM-dd HH:mm

Anderer Ansatz:

Es kann so einfach sein (andere Option ist die Verwendung von Joda-Zeit )

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
quelle
danke, ich habe es versucht, das Datum kommt korrekt, aber wenn ich versuche, es als Zeichenfolge zu ändern, erhalte ich das gleiche falsche Ergebnis. Zeichenfolge newTime = df.format (afterAddingTenMins); es gibt mir 2011-50-07 17:50, ich muss es in String konvertieren, jeder Vorschlag
junaidp
1
@junaidp Sie haben das letzte Stück Code verwendet, aber den ersten Teil der Lösung ignoriert?
Carl
57

Sie können die DateUtils-Klasse im Paket org.apache.commons.lang3.time verwenden

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute
Alireza Alallah
quelle
1
Für Leute, die sich mit älteren Versionen von DateUtils beschäftigen, ist es in Paket ->org.apache.commons.lang.time.DateUtils
realPK
32

Praktische Methode zur Implementierung der Antwort von @ Pangaea:

/*
*  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
quelle
25

Um Abhängigkeiten zu vermeiden, können Sie java.util.Calendar wie folgt verwenden:

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

In Java 8 haben wir eine neue API:

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

Dies ist falsch angegeben:

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

Sie verwenden Minuten anstelle von Monat (MM)

Dawood
quelle
6

tl; dr

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

java.time

Verwenden Sie die hervorragenden Klassen java.time für die Arbeit mit Datum und Uhrzeit. Diese Klassen ersetzen die problematischen alten Datums- / Uhrzeitklassen wie java.util.Dateund java.util.Calendar.

ISO 8601

Die java.time-Klassen verwenden standardmäßig die Standardformate ISO 8601 zum Parsen / Generieren von Zeichenfolgen mit Datums- und Uhrzeitwerten . Ersetzen Sie das Leerzeichen in der Mitte durch a, damit Ihre Eingabezeichenfolge übereinstimmt T.

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

LocalDateTime

Analysieren Sie Ihre Eingabezeichenfolge als, LocalDateTimeda keine Informationen zur Zeitzone oder zum Versatz von UTC vorliegen.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Fügen Sie zehn Minuten hinzu.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Siehe Live-Code in IdeOne.com .

Das LocalDateTimehat keine Zeitzone, so dass es nicht einen Punkt auf der Zeitleiste darstellen. Wenden Sie eine Zeitzone an, um sie in einen tatsächlichen Moment zu übersetzen. Geben Sie einen richtigen Zeitzonennamen im Format continent/region, wie zum Beispiel America/Montreal, Africa/Casablancaoder Pacific/Auckland, oder Asia/Karachi. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie ESToder ISToder, PKTda es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.

ZonedDateTime

Wenn Sie die beabsichtigte Zeitzone für diesen Wert kennen, wenden Sie a ZoneIdan , um a zu erhalten ZonedDateTime.

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

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

Anomalien

Überlegen Sie, ob Sie diese zehn Minuten vor oder nach dem Hinzufügen einer Zeitzone hinzufügen möchten. Sie können ein ganz anderes Ergebnis wegen Anomalien wie Sommerzeit (DST) erhalten, die die Verschiebung der Wand Uhr Zeit .

Ob Sie die 10 Minuten vor oder nach dem Hinzufügen der Zone hinzufügen sollten, hängt von der Bedeutung Ihres Geschäftsszenarios und Ihrer Regeln ab.

Tipp: Wenn Sie einen bestimmten Moment auf der Zeitachse beabsichtigen, behalten Sie immer die Zeitzoneninformationen bei . Verlieren Sie diese Informationen nicht wie bei Ihren Eingabedaten. Soll der Wert 12:34in Pakistan Mittag oder in Frankreich Mittag oder in Québec Mittag sein? Wenn Sie in Pakistan Mittag gemeint haben, geben Sie mindestens den Versatz von UTC ( +05:00) und noch besser den Namen der Zeitzone ( Asia/Karachi) an.

Instant

Wenn Sie den gleichen Moment wie durch die Linse von UTC sehen möchten , extrahieren Sie einen Instant. Die InstantKlasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).

Instant instant = zdt.toInstant();

Konvertieren

Vermeiden Sie nach Möglichkeit die lästigen alten Datums- und Uhrzeitklassen. Aber wenn Sie müssen, können Sie konvertieren. Rufen Sie neue Methoden auf, die den alten Klassen hinzugefügt wurden.

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

Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu java.time.

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Woher bekomme ich die java.time-Klassen?

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .

Basil Bourque
quelle
4

Das Muster Ihres SimpleDateFormat weist einen Fehler auf. es sollte sein

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

benutze dieses Format,

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

mm für Minuten und MM für Monate

Kushan
quelle
2

Sobald Sie Ihr Datum analysiert haben, verwende ich diese Dienstprogrammfunktion, um Stunden, Minuten oder Sekunden hinzuzufügen:

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

Seien Sie vorsichtig, wenn Sie längere Zeiträume hinzufügen. 1 Tag ist nicht immer 24 Stunden (Anpassungen der Sommerzeit, Schaltsekunden usw.) Calendarwird dafür empfohlen.

David Miguel
quelle
1

Arbeite für mich 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
quelle
2
Wie verbessert sich diese Antwort gegenüber der Antwort von alireza alallah aus dem letzten Jahr ? Die Frage bezog sich auch auf Minuten, nicht auf Sekunden.
Basil Bourque
1

Kann ohne die Konstanten durchgeführt werden (wie 3600000 ms ist 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();
}

Anwendungsbeispiel:

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
quelle
1
Diese schrecklichen Datums- und Uhrzeitklassen wurden vor Jahren durch die modernen Java-Zeitklassen ersetzt , als JSR 310 verabschiedet wurde.
Basil Bourque
-2

Nur für alle, die interessiert sind. Ich arbeitete an einem iOS-Projekt, für das ähnliche Funktionen erforderlich waren, und beendete die Portierung der Antwort von @jeznag auf schnell

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
}
Tawheed
quelle
Datum von Swift hatte bereits eine ähnliche eingebaute Funktion, zum Beispiel Datum (timeInterval :, seit :)
Albert