Hinzufügen von n Stunden zu einem Datum in Java?

136

Wie füge ich einem Datumsobjekt n Stunden hinzu? Ich habe ein anderes Beispiel mit Tagen in StackOverflow gefunden, verstehe aber immer noch nicht, wie man es mit Stunden macht.

Jorge Lainfiesta
quelle
3
Verwenden Sie nach Möglichkeit joda-time.sourceforge.net .
Babar
3
Verwenden Sie nach Möglichkeit Java 8 Datum und Uhrzeit.
Peceps
@Babar FYI, das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Siehe Tutorial von Oracle .
Basil Bourque

Antworten:

210

Überprüfen Sie die Kalenderklasse. Es hat eine addMethode (und einige andere), um Zeitmanipulationen zu ermöglichen. So etwas sollte funktionieren.

    Calendar cal = Calendar.getInstance(); // creates calendar
    cal.setTime(new Date()); // sets calendar time/date
    cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
    cal.getTime(); // returns new date object, one hour in the future

Überprüfen Sie die API auf weitere Informationen .

Nikita Rybak
quelle
4
Seien Sie vorsichtig, wenn Sie mit Sommerzeit / Sommerzeit zu tun haben.
CurtainDog
5
Unnötig zu erwähnen, dass Sie "negative Stunden" hinzufügen können
pramodc84
6
@CurtainDog Using Calendar.add()kümmert sich automatisch darum.
Jesper
6
cal.setTime (neues Datum ()) wird nicht benötigt - das Javadoc von Calendar.getInstance () sagt: "Der zurückgegebene Kalender basiert auf der aktuellen Zeit in der Standardzeitzone mit dem Standardgebietsschema."
Mithrandir
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .
Basil Bourque
82

Wenn Sie Apache Commons / Lang verwenden , können Sie dies in einem Schritt tun DateUtils.addHours():

Date newDate = DateUtils.addHours(oldDate, 3);

(Das ursprüngliche Objekt ist unverändert)

Sean Patrick Floyd
quelle
3
Sie können auch negative Stunden verwenden:DateUtils.addHours(oldDate, -1);
Kaptain
Hinter den Kulissen macht dies genau das, was Nikitas Antwort tut, aber das ist sehr einfach und leicht zu lesen. Plus, wenn Sie bereits Apache Commons / Lang verwenden ... warum nicht?
Matt
28

Um das Beispiel von @ Christopher zu vereinfachen.

Angenommen, Sie haben eine Konstante

public static final long HOUR = 3600*1000; // in milli-seconds.

Du kannst schreiben.

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

Wenn Sie anstelle des Datumsobjekts long verwenden , um Datum / Uhrzeit zu speichern, können Sie dies tun

long newDate = oldDate + 2 * HOUR;
Peter Lawrey
quelle
26

tl; dr

myJavaUtilDate.toInstant()
              .plusHours( 8 )

Oder…

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
              .plus(                      // Do the math, adding a span of time to our moment, our `Instant`. 
                  Duration.ofHours( 8 )   // Specify a span of time unattached to the timeline.
               )                          // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

Mit java.time

Das in Java 8 und höher integrierte Java.time-Framework ersetzt die alten Java.util.Date/.Calendar-Klassen. Diese alten Klassen sind notorisch mühsam. Vermeide sie.

Verwenden Sie die toInstantneu zu java.util.Date hinzugefügte Methode, um vom alten Typ in den neuen Typ java.time zu konvertieren. An Instantist ein Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden .

Instant instant = myUtilDate.toInstant();

Sie können dem Stunden hinzufügen, Instantindem Sie ein TemporalAmountsolches übergeben Duration.

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

Um diese Datums- und Uhrzeitangabe zu lesen, generieren Sie durch Aufrufen einen String im Standardformat ISO 8601 toString.

String output = instantHourLater.toString();

Sie können von diesem Moment durch die Linse von einigen der Region sehen wollen Wanduhr Zeit . Passen Sie die InstantZeitzone an Ihre gewünschte / erwartete Zeitzone an, indem Sie eine erstellen ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Alternativ können Sie anrufen plusHours, um Ihre Stundenzahl hinzuzufügen. Eine Zoneneinteilung bedeutet Sommerzeit (DST) und andere Anomalien werden in Ihrem Namen behandelt.

ZonedDateTime later = zdt.plusHours( 8 );

Sie sollten die Verwendung der alten Datums- / Uhrzeitklassen einschließlich java.util.Dateund vermeiden .Calendar. Wenn Sie jedoch wirklich eine java.util.DateInteroperabilität mit Klassen benötigen, die für java.time-Typen noch nicht aktualisiert wurden, konvertieren Sie von ZonedDateTimevia Instant. Neue Methoden, die zu den alten Klassen hinzugefügt wurden, erleichtern die Konvertierung in / von java.time-Typen.

java.util.Date date = java.util.Date.from( later.toInstant() );

Weitere Informationen zum Konvertieren finden Sie in meiner Antwort auf die Frage "Java.util konvertieren". Datum in welchen Typ "java.time"? .


Ü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 den Klassen 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 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*Klassen.

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
23

Mit Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
Babar
quelle
2
+1 ein bisschen unnötig dafür, aber wenn Sie mehr Datumsmanipulation machen wollen, ist Joda Time eine großartige Bibliothek
Joeri Hendrickx
3
@JoeriHendrickx Wenn der Programmierer einem Datum Stunden hinzufügt, ist es sehr wahrscheinlich, dass er andere Datums- und Uhrzeitarbeiten ausführt . Ich halte Joda-Time überhaupt nicht für unnötig; Das erste, was ich beim Einrichten eines neuen Projekts mache, ist das Hinzufügen von Joda-Time. Sogar Sun und Oracle waren sich einig, dass das alte java.util.Date & Calendar auslaufen muss, und fügten Java 8 das neue java.time. * -Paket (inspiriert von Joda-Time) hinzu.
Basil Bourque
Ich hatte Probleme mit Joda auf Android. ClassNotDefinedException
Hielt
23

Seit Java 8:

LocalDateTime.now().minusHours(1);

Siehe LocalDateTimeAPI .

leventov
quelle
4
Nah aber nicht ganz richtig. Sie sollten sich ZonedDateTimeeher für eine als für eine entscheiden LocalDateTime. "Lokal" bedeutet, dass es nicht an einen bestimmten Ort und nicht an die Zeitachse gebunden ist. Wie "Weihnachten beginnt am 25. Dezember 2015 um Mitternacht" ist ein anderer Moment in den verschiedenen Zeitzonen, ohne Bedeutung, bis Sie eine bestimmte Zeitzone anwenden, um einen bestimmten Moment auf der Zeitachse zu erhalten. Darüber hinaus werden ohne eine Zeitzone Sommerzeit (DST) und andere Anomalien bei einer solchen Verwendung von LocalDateTime nicht behandelt. Siehe meine Antwort zum Vergleich.
Basil Bourque
1
Auch um ein java.util.DateObjekt zu bekommen , hatte uns der Anforderer gefragt ZonedDateTime.toInstant()und Date.from()wie hier beschrieben stackoverflow.com/a/32274725/5661065
hayduke
16

Mit der neuen Klasse java.util.concurrent.TimeUnit können Sie dies folgendermaßen tun

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours
Iain
quelle
14

Etwas wie:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours
Christopher Hunt
quelle
1
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .
Basil Bourque
7

Dies ist ein weiterer Code, wenn Ihr DateObjekt im Datetime-Format vorliegt. Das Schöne an diesem Code ist: Wenn Sie mehr Stunden angeben, wird auch das Datum entsprechend aktualisiert.

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

Hier ist die Ausgabe:

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014
vkrams
quelle
1
Sie können auch Folgendes verwenden: Calendar cal = Calendar.getInstance ();
Stefan Sprenger
4
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);
Geisterfahrer
quelle
4

Wenn Sie bereit sind zu verwenden java.time, finden Sie hier eine Methode zum Hinzufügen von ISO 8601-formatierten Dauern:

import java.time.Duration;
import java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  
Daniel
quelle
1
Duration.parse(iso8601duration)ist interessant, danke, aber Sie nicht Operator kann +auf LocalDateTime, können Sie bearbeiten möchten , dass. Funktioniert aber .plus(...).
qlown
Danke @qlown, ich denke das + funktioniert in groovy, weil ich es jetzt so benutze. Ich werde die Antwort entsprechend ändern.
Daniel
Die Frage bezieht sich auf ein DateObjekt, das einen bestimmten Moment in UTC darstellt. Ihre Verwendung von LocalDateTimekann die Frage nicht beantworten. LocalDateTimeEs fehlt ein Konzept der Zeitzone oder des Versatzes von UTC und kann daher keinen Moment darstellen. Falsche Klasse für dieses Problem. Siehe Was ist der Unterschied zwischen Instant und LocalDateTime?
Basil Bourque
@ BasilBourque- DateObjekt ist veraltet. Die Frage ist in Bezug auf die Zeitzone nicht eindeutig, daher stehen meine Antworten. Darüber hinaus können Sie nur die Swap LocalDateTimefür ZonedDateTime.
Daniel
4

Sie können dies mit der Joda DateTime-API tun

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
Ratte
quelle
Arbeiten, nachdem ich die erste Zeile in DateTime geändert habe dateTime = new DateTime (dateObj);
Sundararaj Govindasamy
1

mithilfe von Java 8-Klassen. Wir können Datum und Uhrzeit sehr einfach wie unten manipulieren.

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);
Abdul Gafoor
quelle
Die Frage bezieht sich auf ein DateObjekt, das einen bestimmten Moment in UTC darstellt. Ihre Verwendung von LocalDateTimekann die Frage nicht beantworten. LocalDateTimeEs fehlt ein Konzept der Zeitzone oder des Versatzes von UTC und kann daher keinen Moment darstellen. Falsche Klasse für dieses Problem. Siehe Was ist der Unterschied zwischen Instant und LocalDateTime?
Basil Bourque
0

Sie können die LocalDateTime-Klasse aus Java 8 verwenden. Zum Beispiel:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Sajit Gupta
quelle
Die Frage bezieht sich auf ein DateObjekt, das einen bestimmten Moment in UTC darstellt. Ihre Verwendung von LocalDateTimekann die Frage nicht beantworten. LocalDateTimeEs fehlt ein Konzept der Zeitzone oder des Versatzes von UTC und kann daher keinen Moment darstellen. Falsche Klasse für dieses Problem. Siehe Was ist der Unterschied zwischen Instant und LocalDateTime?
Basil Bourque
-1

Sie können diese Methode verwenden. Es ist leicht zu verstehen und zu implementieren:

public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
    calendar.add(Calendar.MINUTE, nombreMinute);
    calendar.add(Calendar.SECOND, nombreSeconde);
    return calendar.getTime();
}
Nimpo
quelle
Dieser Ansatz wird bereits in einer anderen Antwort vorgestellt, die vor Jahren veröffentlicht wurde. Ich sehe nicht, wie dieser mehr Wert schafft.
Basil Bourque
Der Mehrwert meines Vorschlags ist die Einfachheit und einfache Implementierung. Der Benutzer muss ihn nur einfügen und verwenden und die Stunden, Minuten oder Sekunden hinzufügen. Wie Sie wissen, unterscheidet sich die Stufe der Anfänger, und wenn die vorgeschlagenen Antworten zwischen einfachen Antworten kombiniert werden und fortgeschrittene Antworten wird es spürbar sein :)
Nimpo