web-dev-qa-db-de.com

Ändern des Java-Datums um eine Stunde zurück

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 abrufen und es auf eine Stunde zurückstellen, sodass es mir Folgendes geben sollte:

Thu Jan 12 09:17:47 GMT 2012

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

94
Makky

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));
180
Kimi

Ä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));
58
Peter Lawrey

tl; dr

In UTC :

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

Oder zoniert:

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

Java.time verwenden

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 Klasse Instant .

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

Auf die Konsole ausgeben.

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 das gestrige Datum zurückgegangen ist.

ZonedDateTime

Wenn Sie sich für eine Zeitzone interessieren, verwenden Sie die Klasse ZonedDateTime . Sie können mit einem Instant beginnen und dann einer Zeitzone ein ZoneId Objekt 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 );

Auf die Konsole ausgeben.

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

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

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

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

Umwandlung

Die alten Java.util.Date/.Calendar-Klassen sind jetzt veraltet. Vermeide sie. Sie sind bekanntermaßen lästig und verwirrend. 

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

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

…oder…

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

Über Java.time

Das Framework Java.time ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Legacy -Date-Time-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Projekt Joda-Time , jetzt im Wartungsmodus , empfiehlt die Migration zu den Klassen Java.time .

Weitere Informationen finden Sie unter Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen. 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.

Wo erhalten Sie die Java.time-Klassen? 

Das Projekt ThreeTen-Extra 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 einige nützliche Klassen wie Interval , YearWeek , YearQuarter und more .

10
Basil Bourque

Verwenden Sie Calendar .

Calendar cal = Calendar.getInstance();

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

Oder mit der berühmten Joda Time Bibliothek:

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

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

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

6
Sumit Jain

Sie können aus dem folgenden Code 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: Here

Und: Here

Und: Here

Wenn Sie nur Zeit brauchen:

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

Dies kann mit Java.util.Date erreicht werden. Der folgende Code wird 1 Stunde von Ihrem Datum abgezogen.

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

Ebenso für das Abziehen von 20 Sekunden von Ihrem Datum

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

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

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

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