java.time
Die Antwort von Habsq hat die richtige Idee, aber die falschen Methoden.
Verwenden Sie für einen Zeitraum, der nicht an die Zeitachse in der Größenordnung von Jahren, Monaten und Tagen gebunden ist Period
. Verwenden Sie für Tage, die 24-Stunden-Zeitabschnitte ohne Bezug zum Kalender und Stunden-Minuten-Sekunden bedeuten Duration
. Das Mischen der beiden Skalen macht selten Sinn.
Duration
Beginnen Sie mit dem Abrufen des aktuellen Moments in UTC mithilfe der Instant
Klasse.
Instant now = Instant.now(); // Capture the current moment as seen in UTC.
Instant then = now.minus( 8L , ChronoUnit.HOURS ).minus( 8L , ChronoUnit.MINUTES ).minus( 8L , ChronoUnit.SECONDS );
Duration d = Duration.between( then , now );
Generieren Sie Text für Stunden, Minuten und Sekunden.
// Generate text by calling `to…Part` methods.
String output = d.toHoursPart() + " hours ago\n" + d.toMinutesPart() + " minutes ago\n" + d.toSecondsPart() + " seconds ago";
Dump zur Konsole.
System.out.println( "From: " + then + " to: " + now );
System.out.println( output );
Von: 2019-06-04T11: 53: 55.714965Z bis: 2019-06-04T20: 02: 03.714965Z
vor 8 Stunden
Vor 8 Minuten
Vor 8 Sekunden
Period
Beginnen Sie mit dem Abrufen des aktuellen Datums.
Eine Zeitzone ist entscheidend für die Bestimmung eines Datums. Für jeden Moment variiert das Datum weltweit je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während es noch „gestern“ in Montréal Québec ist .
Wenn keine Zeitzone angegeben ist, wendet die JVM implizit ihre aktuelle Standardzeitzone an. Diese Standardeinstellung kann sich jederzeit zur Laufzeit (!) Ändern , sodass Ihre Ergebnisse variieren können. Geben Sie Ihre gewünschte / erwartete Zeitzone besser explizit als Argument an. Wenn dies kritisch ist, bestätigen Sie die Zone mit Ihrem Benutzer.
Geben Sie einen richtigen Zeitzonennamen im Format Continent/Region
, wie zum Beispiel America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung für 2-4 Buchstaben, wie z. B. EST
oder, IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Erstellen Sie ein Datum vor acht Tagen, Monaten und Jahren neu.
LocalDate then = today.minusYears( 8 ).minusMonths( 8 ).minusDays( 7 ); // Notice the 7 days, not 8, because of granularity of months.
Verstrichene Zeit berechnen.
Period p = Period.between( then , today );
Bauen Sie die Kette von "vor langer Zeit" Stücken.
String output = p.getDays() + " days ago\n" + p.getMonths() + " months ago\n" + p.getYears() + " years ago";
Dump zur Konsole.
System.out.println( "From: " + then + " to: " + today );
System.out.println( output );
Von: 27.09.2010 bis: 04.06.2019
vor 8 Tagen
vor 8 Monaten
Vor 8 Jahren
Ü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
.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
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 .