Warum wird der Monat auf 50 geändert, nachdem ich 10 Minuten hinzugefügt habe?

Lesezeit: 7 Minuten

Benutzer-Avatar
junaidp

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, das obige Datum um 10 Minuten zu verlängern.

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

Wert von 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!

  • mögliches Duplikat von Java , Hinzufügen von Minuten zu einem Date , seltsame Anomalie

    – Basilikum Bourque

    21. Juni 2014 um 1:33 Uhr

  • Mögliches Duplikat von Wie addiere ich einen Monat zum aktuellen Datum in Java?

    – MadBoomy

    30. September 2017 um 20:44 Uhr

  • Für neue Leser auf die Frage empfehle ich Ihnen, nicht zu verwenden SimpleDateFormat, Date und Calendar. Diese Klassen sind schlecht gestaltet und seit langem veraltet, wobei die erste besonders notorisch lästig ist. Verwenden Sie stattdessen LocalDateTime und DateTimeFormatterbeide aus java.time, die moderne Java-API für Datum und Uhrzeit.

    – Ole VV

    18. April 2021 um 7:40 Uhr

  • Ich stimme den vorgeschlagenen Duplikaten nicht zu. Diese Frage bezieht sich auf SimpleDateFormat, das den Monat beim Analysieren ignoriert, aber kein Duplikat davon. Es kann als Duplikat des viel späteren Bei der Verwendung der Datumsauswahl in Android angesehen werden, muss aber nicht, dass es das falsche Datum auswählt [duplicate].

    – Ole VV

    18. April 2021 um 7:52 Uhr

  • idk Wenn Ihnen jemand gesagt hat, dass Sie Minuten und Monate im gleichen Format analysieren, werden Monate mit Großbuchstaben “yyyy-MM-dd” und Minuten mit Kleinbuchstaben “HH: mm: ss” gelesen, da Sie parsen Monat mit Kleinbuchstaben fügt der Kalender Ihre Minuten zu Ihrem Monat hinzu.

    – Pedro Joaquin

    18. April um 16:37 Uhr

Benutzer-Avatar
Aravind Yarram

Das Problem für Sie ist, dass Sie verwenden mm. Du solltest benutzen MM. MM ist für Monat und mm ist minutenlang. Versuche es mit yyyy-MM-dd HH:mm

Anderer Ansatz:

Es kann so einfach sein (eine 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));

  • danke, ich habe das versucht, das Datum kommt richtig, aber wenn ich versuche, es als string zu ändern, gibt es mir das gleiche falsche Ergebnis String newTime= df.format(afterAddingTenMins); es gibt mir 2011-50-07 17:50 , ich muss es in String konvertieren, irgendein Vorschlag

    – junaidp

    28. Januar 2012 um 8:53 Uhr


  • @junaidp Sie haben das letzte Codestück verwendet, aber den ersteren Teil der Lösung ignoriert?

    – Carl

    28. Januar 2012 um 8:56 Uhr

  • Der Fehler — mit Kleinbuchstaben mm statt Großbuchstaben MM — bedeutet wahrscheinlich auch, dass das geparste Datum, Fri Jan 07 17:40:00 PKT 2011, falsch ist. Das SimpleDateFormat übernimmt den Monat nicht aus der ursprünglichen Zeichenfolge und setzt den Monat standardmäßig auf Januar.

    – Ole VV

    18. April 2021 um 8:04 Uhr


Benutzer-Avatar
Alireza Allah

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

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

  • Für Leute, die mit einer älteren Version von DateUtils zu tun haben, ist es im Paket vorhanden -> org.apache.commons.lang.time.DateUtils

    – realPK

    24. Mai 2017 um 21:19 Uhr

Benutzer-Avatar
jeznag

Komfortmethode zum Implementieren der Antwort von @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;
}

Benutzer-Avatar
Marco Montel

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

Das ist falsch angegeben:

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

Sie verwenden Minuten statt Monate (MM)

Benutzer-Avatar
Gemeinschaft

tl;dr

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

java.time

Verwenden Sie die hervorragenden java.time-Klassen für Datums- und Zeitangaben. Diese Klassen ersetzen die lästigen alten Datums-Zeit-Klassen wie z java.util.Date und java.util.Calendar.

ISO 8601

Die java.time-Klassen verwenden standard ISO 8601 formatiert standardmäßig zum Analysieren/Generieren von Zeichenfolgen mit Datums- und Uhrzeitwerten. Damit Ihre Eingabezeichenfolge übereinstimmt, ersetzen Sie das LEERZEICHEN in der Mitte durch a T.

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

LocalDateTime

Analysieren Sie Ihre Eingabezeichenfolge als a LocalDateTime da es keine Informationen über die Zeitzone oder den Offset von UTC gibt.

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

Sehen Live-Code in IdeOne.com.

Dass LocalDateTime hat keine Zeitzone, also tut es nicht stellen einen Punkt auf der Zeitachse dar. Wenden Sie eine Zeitzone an, um sie in einen tatsächlichen Moment zu übersetzen. Geben Sie a an richtiger Zeitzonenname im Format von continent/regionwie zum Beispiel America/Montreal, Africa/Casablancaoder Pacific/Aucklandoder Asia/Karachi. Verwenden Sie niemals die 3-4-Buchstaben-Abkürzung wie z EST oder IST oder PKT so wie sie sind nicht echte Zeitzonen, nicht standardisiert und nicht einmal eindeutig (!).

ZonedDateTime

Wenn Sie die beabsichtigte Zeitzone für diesen Wert kennen, wenden Sie a an ZoneId ein bekommen 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. Aufgrund von Anomalien wie der Sommerzeit (DST), die die Uhrzeit verschieben, erhalten Sie möglicherweise ein ganz anderes Ergebnis Wandzeit.

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 Zeitleiste beabsichtigen, Bewahren Sie immer die Zeitzoneninformationen auf. Verlieren Sie diese Informationen nicht, wie es bei Ihren Eingabedaten der Fall ist. Ist der Wert 12:34 Soll Mittag in Pakistan oder Mittag in Frankreich oder Mittag in Québec sein? Wenn Sie Mittag in Pakistan meinten, sagen Sie dies, indem Sie mindestens den Versatz von UTC (+05:00) und noch besser der Name der Zeitzone (Asia/Karachi).

Instant

Wenn Sie den gleichen Moment wie durch die Linse sehen möchten koordinierte Weltzeitextrahiere ein Instant. Das Instant Klasse repräsentiert einen Moment auf der Zeitachse in koordinierte Weltzeit 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-Zeit-Klassen. 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 ersetzen die lästigen alten Erbe Datum-Zeit-Klassen wie z java.util.Date, Calendar& SimpleDateFormat.

Das Joda-Zeit Projekt, jetzt in Wartungsmodusrät zur Migration auf java.time.

Weitere Informationen finden Sie unter Oracle-Tutorial. Und durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR310.

Wo erhalte ich die java.time-Klassen?

  • Java SE 8 und SE 9 und später
    • Eingebaut.
    • Teil der Standard-Java-API mit einer gebündelten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 und SE 7
    • Ein Großteil der java.time-Funktionalität wurde in Java 6 & 7 zurückportiert ThreeTen-Backport.
  • Android
    • Das ThreeTenABP Projekt passt ThreeTen-Backport (oben erwähnt) speziell für Android.
    • Sehen Wie benutzt man….

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

Benutzer-Avatar
Baldrick

Es gibt einen Fehler im Muster Ihres SimpleDateFormat. es sollte sein

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

1321920cookie-checkWarum wird der Monat auf 50 geändert, nachdem ich 10 Minuten hinzugefügt habe?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy