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());
Der Wert von newTime
ändert sich in 2011-50-07 17:50
Er sollte jedoch 07-01-2011 17:50
sein.
Es fügt Minuten richtig hinzu, aber es ändert sich auch Monat, weiß nicht warum!
Das Problem für Sie ist, dass Sie mm
verwenden. Sie sollten MM
verwenden. MM
ist für Monat und mm
für Minuten. Versuchen Sie es mit yyyy-MM-dd HH:mm
Anderer Ansatz:
So einfach kann das sein (andere Option ist 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));
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
Komfortmethode für die Implementierung von @ Pangaea's Antwort:
/*
* 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;
}
Dies ist falsch angegeben:
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Sie verwenden Minuten anstelle von Monat (MM)
Um jegliche Abhängigkeit 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());
LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )
Verwenden Sie die ausgezeichneten Java.time-Klassen für Datums-/Uhrzeitarbeit. Diese Klassen ersetzen die störenden alten Datum-Uhrzeit-Klassen wie Java.util.Date
und Java.util.Calendar
.
Die Java.time-Klassen verwenden standardmäßig die Standardformate ISO 8601 zum Analysieren/Generieren von Zeichenfolgen von Datum-Uhrzeit-Werten. Ersetzen Sie den SPACE in der Mitte durch eine T
, damit Ihre Eingabezeichenfolge übereinstimmt.
String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );
LocalDateTime
Analysieren Sie Ihre Eingabezeichenfolge als LocalDateTime
, da keine Informationen zur Zeitzone oder zum Offset von UTC vorhanden sind.
LocalDateTime ldt = LocalDateTime.parse( inputModified );
Zehn Minuten hinzufügen.
LocalDateTime ldtLater = ldt.plusMinutes( 10 );
ldt.toString (): 2016-01-23T12: 34
ldtLater.toString (): 2016-01-23T12: 44
Siehe Live-Code in IdeOne.com .
Da LocalDateTime
keine Zeitzone hat, repräsentiert nicht einen Punkt auf der Timeline. Wenden Sie eine Zeitzone an, um einen tatsächlichen Moment zu übersetzen. Geben Sie einen richtigen Zeitzonennamen im Format continent/region
an, wie America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
oder Asia/Karachi
. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie EST
oder IST
oder PKT
, da sie nicht echte Zeitzonen sind, nicht standardisiert und nicht einmal eindeutig (!).
ZonedDateTime
Wenn Sie die beabsichtigte Zeitzone für diesen Wert kennen, wenden Sie eine ZoneId
an, um eine ZonedDateTime
zu erhalten.
ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Asien/Karachi]
Ü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 erhalten, da Anomalien wie die Sommerzeit (DST) auftreten, die die Wanduhrzeit verschieben.
Ob Sie die 10 Minuten vor oder nach dem Hinzufügen der Zone hinzufügen, hängt von der Bedeutung Ihres Geschäftsszenarios und Ihrer Regeln ab.
Tipp: Wenn Sie einen bestimmten Moment auf der Zeitleiste haben, behalten Sie immer die Zeitzoneninformationen. Verlieren Sie diese Informationen nicht wie bei Ihren Eingabedaten. Soll der Wert 12:34
mittags in Pakistan oder mittags in Frankreich oder mittags in Québec sein? Wenn Sie in Pakistan Mittag meinten, sagen Sie dies, indem Sie mindestens den Offset von UTC (+05:00
) und noch besser den Namen der Zeitzone (Asia/Karachi
) angeben.
Instant
Wenn Sie den gleichen Moment wie durch die Linse von UTC sehen möchten, extrahieren Sie eine Instant
. Die Instant
Klasse repräsentiert einen Moment auf der Timeline in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern eines Dezimalbruchs).
Instant instant = zdt.toInstant();
Vermeiden Sie die lästigen alten Datum-Zeit-Klassen, wann immer dies möglich ist. 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 );
Das Java.time -Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die lästigen alten Legacy Date-Time-Klassen wie Java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time -Projekt, jetzt im Wartungsmodus , empfiehlt die Migration zu Java.time.
Weitere Informationen finden Sie im Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .
Wo erhalten Sie 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 Erweiterungen von Java.time. Hier finden Sie nützliche Klassen wie Interval
, YearWeek
, YearQuarter
und more .
Im Muster Ihres SimpleDateFormat ist ein Fehler aufgetreten. es sollte sein
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
verwenden Sie dieses Format,
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
mm für Minuten und MM für Monat
Nachdem Sie das Datum analysiert haben, kann ich mit dieser Utility-Funktion Stunden, Minuten oder Sekunden hinzufü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 lange Zeiträume hinzufügen, 1 Tag ist nicht immer 24 Stunden (Sommerzeit-Anpassungen, Schaltsekunden usw.). Calendar
wird dafür empfohlen.
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)