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.
Ü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(newDate());// 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 .
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."
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
publicstaticfinallong HOUR =3600*1000;// in milli-seconds.
Du kannst schreiben.
Date newDate =newDate(oldDate.getTime()+2* HOUR);
Wenn Sie anstelle des Datumsobjekts long verwenden , um Datum / Uhrzeit zu speichern, können Sie dies tun
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.
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.
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());
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.
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 .
+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
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
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 =newSimpleDateFormat("HH:mm dd/MM/yyyy");Date myDateTime =null;//Parse your string to SimpleDateFormattry{
myDateTime = simpleDateFormat.parse(myString);}catch(ParseException e){
e.printStackTrace();}System.out.println("This is the Actual Date:"+myDateTime);Calendar cal =newGregorianCalendar();
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 ActualDate:FriDec1209:00:00 EST 2014This is HoursAddedDate:SatDec1306:00:00 EST 2014
Sie können auch Folgendes verwenden: Calendar cal = Calendar.getInstance ();
Stefan Sprenger
4
Date argDate =newDate();//set your date.String argTime ="09:00";//9 AM - 24 hour format :- Set your time.SimpleDateFormat sdf =newSimpleDateFormat("dd-MMM-yyyy");SimpleDateFormat dateFormat =newSimpleDateFormat("dd-MMM-yyyy HH:mm");String dateTime = sdf.format(argDate)+" "+ argTime;Date requiredDate = dateFormat.parse(dateTime);
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=newDateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
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));
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:
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 :)
Antworten:
Überprüfen Sie die Kalenderklasse. Es hat eine
add
Methode (und einige andere), um Zeitmanipulationen zu ermöglichen. So etwas sollte funktionieren.Überprüfen Sie die API auf weitere Informationen .
quelle
Calendar.add()
kümmert sich automatisch darum.java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .Wenn Sie Apache Commons / Lang verwenden , können Sie dies in einem Schritt tun
DateUtils.addHours()
:(Das ursprüngliche Objekt ist unverändert)
quelle
DateUtils.addHours(oldDate, -1);
Um das Beispiel von @ Christopher zu vereinfachen.
Angenommen, Sie haben eine Konstante
Du kannst schreiben.
Wenn Sie anstelle des Datumsobjekts long verwenden , um Datum / Uhrzeit zu speichern, können Sie dies tun
quelle
tl; dr
Oder…
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
toInstant
neu zu java.util.Date hinzugefügte Methode, um vom alten Typ in den neuen Typ java.time zu konvertieren. AnInstant
ist ein Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden .Sie können dem Stunden hinzufügen,
Instant
indem Sie einTemporalAmount
solches übergebenDuration
.Um diese Datums- und Uhrzeitangabe zu lesen, generieren Sie durch Aufrufen einen String im Standardformat ISO 8601
toString
.Sie können von diesem Moment durch die Linse von einigen der Region sehen wollen Wanduhr Zeit . Passen Sie die
Instant
Zeitzone an Ihre gewünschte / erwartete Zeitzone an, indem Sie eine erstellenZonedDateTime
.Alternativ können Sie anrufen
plusHours
, um Ihre Stundenzahl hinzuzufügen. Eine Zoneneinteilung bedeutet Sommerzeit (DST) und andere Anomalien werden in Ihrem Namen behandelt.Sie sollten die Verwendung der alten Datums- / Uhrzeitklassen einschließlich
java.util.Date
und vermeiden.Calendar
. Wenn Sie jedoch wirklich einejava.util.Date
Interoperabilität mit Klassen benötigen, die für java.time-Typen noch nicht aktualisiert wurden, konvertieren Sie vonZonedDateTime
viaInstant
. Neue Methoden, die zu den alten Klassen hinzugefügt wurden, erleichtern die Konvertierung in / von java.time-Typen.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 .quelle
Mit Joda-Time
quelle
ClassNotDefinedException
Seit Java 8:
Siehe
LocalDateTime
API .quelle
ZonedDateTime
eher für eine als für eine entscheidenLocalDateTime
. "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.java.util.Date
Objekt zu bekommen , hatte uns der Anforderer gefragtZonedDateTime.toInstant()
undDate.from()
wie hier beschrieben stackoverflow.com/a/32274725/5661065Mit der neuen Klasse java.util.concurrent.TimeUnit können Sie dies folgendermaßen tun
quelle
Etwas wie:
quelle
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .Dies ist ein weiterer Code, wenn Ihr
Date
Objekt im Datetime-Format vorliegt. Das Schöne an diesem Code ist: Wenn Sie mehr Stunden angeben, wird auch das Datum entsprechend aktualisiert.Hier ist die Ausgabe:
quelle
quelle
Wenn Sie bereit sind zu verwenden
java.time
, finden Sie hier eine Methode zum Hinzufügen von ISO 8601-formatierten Dauern:quelle
Duration.parse(iso8601duration)
ist interessant, danke, aber Sie nicht Operator kann+
aufLocalDateTime
, können Sie bearbeiten möchten , dass. Funktioniert aber.plus(...)
.Date
Objekt, das einen bestimmten Moment in UTC darstellt. Ihre Verwendung vonLocalDateTime
kann die Frage nicht beantworten.LocalDateTime
Es 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?Date
Objekt ist veraltet. Die Frage ist in Bezug auf die Zeitzone nicht eindeutig, daher stehen meine Antworten. Darüber hinaus können Sie nur die SwapLocalDateTime
fürZonedDateTime
.Sie können dies mit der Joda DateTime-API tun
quelle
mithilfe von Java 8-Klassen. Wir können Datum und Uhrzeit sehr einfach wie unten manipulieren.
quelle
Date
Objekt, das einen bestimmten Moment in UTC darstellt. Ihre Verwendung vonLocalDateTime
kann die Frage nicht beantworten.LocalDateTime
Es 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?Sie können die LocalDateTime-Klasse aus Java 8 verwenden. Zum Beispiel:
quelle
Date
Objekt, das einen bestimmten Moment in UTC darstellt. Ihre Verwendung vonLocalDateTime
kann die Frage nicht beantworten.LocalDateTime
Es 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?Sie können diese Methode verwenden. Es ist leicht zu verstehen und zu implementieren:
quelle