Ändern des Java-Datums vor einer Stunde

124

Ich habe ein Java-Datumsobjekt:

Date currentDate = new Date();

Dies gibt das aktuelle Datum und die aktuelle Uhrzeit an. Beispiel:

Thu Jan 12 10:17:47 GMT 2012

Stattdessen möchte ich das Datum erhalten und es auf eine Stunde zurück ändern, damit es mir Folgendes gibt:

Thu Jan 12 09:17:47 GMT 2012

Was wäre der beste Weg, dies zu tun?

Makky
quelle
mktimeGibt es ein Äquivalent in Java? 60 Minuten davon abziehen?
Shiplu Mokaddim

Antworten:

243

java.util.Calendar

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

Java 8: java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

Java 8 java.time.Instant

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));
Kimi
quelle
8
Variieren Sie einfach die Tatsache, dass es Calendar.HOUR gibt, das mit 12-Stunden-Uhr und Calendar.HOUR_OF_DAY für 24-Stunden-Uhr funktioniert
Wolf
Würde die erste Lösung mit Kalender funktionieren, wenn die Zeit eines Tages Mitternacht ist und Sie eine Stunde früher wollen, also 23 Uhr am Vortag?
George Arokiam
1
@ GeorgeArokiam ja es würde
Kimi
66

Ähnlich der Lösung von @Sumit Jain

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

oder

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));
Peter Lawrey
quelle
3
Viel bessere Lösung. Die Erstellung von Kalenderinstanzen sieht in dieser speziellen Anwendung wie ein Overkill aus.
www.Decompiler.com
2
@ Cosmolev Kalender ist in den meisten Beispielen, die ich finde, übertrieben.
Peter Lawrey
2
@Stoan Ich habe ein besser lesbares Beispiel hinzugefügt. Sie sollten beachten, dass der Kalender unglaublich ineffizient ist.
Peter Lawrey
@ PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Dies sollte 10 Minuten hinterher sein?
Siya Sosibo
15

tl; dr

In UTC :

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

Oder in Zonen unterteilt:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

Mit java.time

In Java 8 und höher ist das neue Java.time- Framework integriert.

Instant

Wenn Sie sich nur für UTC (GMT) interessieren, verwenden Sie die InstantKlasse.

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

Zur Konsole werfen.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

Augenblick: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

Beachten Sie, wie in diesem Moment zum gestrigen Datum zurückgekehrt wurde.

ZonedDateTime

Wenn Sie sich für eine Zeitzone interessieren, verwenden Sie die ZonedDateTimeKlasse. Sie können mit einem Instant beginnen und eine Zeitzone, ein ZoneIdObjekt, zuweisen . Diese Klasse behandelt die erforderlichen Anpassungen für Anomalien wie Sommerzeit (DST) .

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );

Zur Konsole werfen.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

Augenblick: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [Amerika / Montreal]

zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [Amerika / Montreal]

Umwandlung

Die alten Klassen java.util.Date/.Calendar sind jetzt veraltet. Vermeide sie. Sie sind notorisch lästig und verwirrend.

Wenn Sie die alten Klassen für den Betrieb mit altem Code verwenden müssen, der für die java.time-Typen noch nicht aktualisiert wurde, rufen Sie die Konvertierungsmethoden auf. Hier ist ein Beispielcode, der von einem Instant oder einem ZonedDateTime zu einem java.util.Date wechselt.

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

…oder…

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

Ü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
Hallo Sir, ich kann immer noch nicht den richtigen Weg finden, um "Zeit vor" für den Instant zu machen.
Ticherhaz
9

Verwenden Sie Kalender .

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
adarshr
quelle
7

Oder nutzen Sie die berühmte Joda Time- Bibliothek:

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Jean Logeart
quelle
5

Subtrahieren Sie einfach die Anzahl der Millisekunden in einer Stunde vom Datum.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));

Sumit Jain
quelle
4

Sie können den folgenden Code für Datum und Uhrzeit verwenden:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

Ausgabe :

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

Dieser Link ist gut: Siehe hier

Und siehe: Siehe auch

Und: hier

Und: hier

Und: hier

Wenn Sie nur Zeit brauchen:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

quelle
2
Zu Ihrer Information: Diese Antwort verwendet problematische alte Datums- / Uhrzeitklassen, die jetzt Legacy sind und durch die modernen java.time-Klassen ersetzt werden.
Basil Bourque
0

Dies kann erreicht werden mit java.util.Date. Der folgende Code subtrahiert 1 Stunde von Ihrem Datum.

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

Ähnliches gilt für das Subtrahieren von 20 Sekunden von Ihrem Datum

newDate = DateUtils.addSeconds(date, -20)    
Dhananjay
quelle
-1

Ermitteln Sie die Zeit in Millisekunden abzüglich Ihrer Minuten in Millisekunden und konvertieren Sie sie in Datum. Hier muss man einen objektivieren !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);
Zenit
quelle
@ Makky: Ich weiß, dass sich die Dinge geändert haben. Aber es ist keine falsche Antwort !!! Warum sagst du das eine falsche Antwort? Haben Sie die akzeptierte Antwort vollständig gesehen?
Zenith
1
Warum sollten Sie überhaupt eine Frage beantworten, die 5 Jahre alt ist und die Antwort akzeptiert hat?
Makky
Diese Antwort bietet keinen Wert über die vorhandenen Jahre alten Antworten hinaus. Und diese Antwort verwendet unklugerweise schreckliche alte Datums- / Uhrzeitklassen, die seit Jahren durch die java.time-Klassen ersetzt wurden. Ein weiteres Problem: Diese Antwort ignoriert das Problem der Zeitzone und zeigt Code an, der die aktuelle Standardzeitzone der JVM verwendet, während die Frage nach GMT / UTC gestellt wird. Siehe die späteren Teile der richtigen Antwort von Kimi oder meine Antwort .
Basil Bourque
-1

Es funktionierte für mich stattdessen im Format. Um mit der Zeit zu arbeiten, verwenden Sie einfach die Methoden parse und toString ()

String localTime = "6:11"; LocalTime localTime = LocalTime.parse (Ortszeit)

LocalTime lt = 6:11; localTime = lt.toString ()

Shahid Hussain Abbasi
quelle
1
Diese Antwort behandelt die Frage nicht. Bei der Frage geht es um mehr als nur eine Tageszeit.
Basil Bourque