Frage

Ich finde es komisch, dass Java (oder die java.util Bibliothek) nicht über eine eingebaute Funktion Unterschied in Daten zu berechnen. Ich mag ein Datum von einem anderen subtrahieren, um die verstrichene Zeit zwischen ihnen zu bekommen. Was ist der beste Weg, dies zu tun?

Ich weiß, dass die einfache Möglichkeit, den Unterschied der Zeit in Millisekunden zu nehmen ist, und dann, dass in Tage umwandeln. Aber ich wollte wissen, ob dies in allen Fällen funktioniert (mit Sommerzeit, usw.).

War es hilfreich?

Lösung

  

Ich weiß, dass der einfache Weg ist das nehmen   Differenz der Zeit in Millisekunden   und dann konvertieren, dass in Tagen.   Allerdings wollte ich, wenn dies wissen   arbeitet in allen Fällen (mit Tageslicht   Speicher, etc.).

Wenn Sie Ihre Zeiten von UTC Daten abgeleitet sind, oder sie sind nur die Differenz zwischen zwei Anrufen zu System.getCurrentTimeMillis () auf dem gleichen System gemessen, erhalten Sie eine gültige Anzahl von Millisekunden als die Differenz, unabhängig von irgendwelchen Zeitzone Fragen erhalten . (Weshalb sollte alles UTC als Speicherformat verwenden - es ist viel einfacher, von UTC- zu gehen> Ortszeit, wenn Sie versuchen, den anderen Weg zu gehen, dann müssen Sie die lokale Zeitzone speichern zusammen mit der Ortszeit - oder versuchen, es zu schließen, Gack!)

Wie dies in eine Anzahl von Tagen drehen, sollten Sie nur in der Lage sein, von 86400000 zu teilen ... mit dem Vorbehalt, dass es eine gelegentlicher Schaltsekunde alle zwei Jahre oder so.

Andere Tipps

Java fehlt nicht viel, wenn man sich Open-Source aussehen: versuchen Joda-Time .

Verwenden Sie entweder Joda-Time oder das neue java.time Paket in Java 8.

Beide Frameworks verwenden die Halboffen Ansatz, bei dem der Anfang inklusive , während das Ende ist exklusiv . Manchmal als [) notiert. Dies ist im Allgemeinen der beste Ansatz für Spannweiten von Zeit zu definieren.

java.time

Der java.time Rahmen eingebaut in Java 8 und hat später eine Period Klasse eine Zeitspanne als eine Reihe von Jahren zu vertreten, eine Anzahl von Monaten, und eine Anzahl von Tagen. Aber diese Klasse beschränkt sich auf ganze Tage, keine Darstellung von Stunden, Minuten und Sekunden an.

Beachten Sie, dass wir eine Zeitzone angeben, von entscheidender Bedeutung für ein Datum zu bestimmen. Zum Beispiel, ein neuer Tag bricht früher in Paris als in Montréal .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate now = LocalDate.now( zoneId );
LocalDate then = LocalDate.of( 2001, 1, 1 );
Period period = Period.between( then, now );
  

Dann: 2001-01-01. Jetzt: 2015.09.07. Zeitraum: P14Y8M6D. Tage: 5362

Für ganze Tage, dann Sommerzeit (DST) ist irrelevant.

Wenn Sie eine Anzahl von insgesamt Tagen wollen, verwenden Sie die ChronoUnit enum, die einige Berechnungsmethoden enthält. Beachten Sie die Berechnungen eine lange zurück.

long days = ChronoUnit.DAYS.between( then, now );  // "5362" seen above.

Ich habe gefragt über eine volle Periode in java.time tun, einschließlich Stunden, Minuten, Sekunden. Nicht möglich, da die Java 8. Eine überraschende Problemumgehung mithilfe der mitgelieferten Bibliotheken wurde vorgeschlagen von Meno Hochschild : Verwenden Sie ein Duration Klasse in der javax.xml.datatype Paket .

Joda-Time

Hier ist ein Beispiel-Code in Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );
Period period = new Period( start, stop );

toString Aufruf erhalten Sie eine String-Darstellung in der von der ISO 8601 rel="nofollow href="http://en.wikipedia.org/wiki/ISO_8601" definierte Form erhalten Standard , PnYnMnDTnHnMnS.

Mit der date4j Bibliothek:

int numDaysBetween = oneDate.numDaysFrom(anotherDate);

Es ist einfach so, wie es zu implementieren. Wir können Calendar.add Methode mit Schleife verwenden. Zum Beispiel, wie unten,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");

Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);

Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);

Die Minus-Tage zwischen Begindate und endDate, und der Code wie unten,

int minusDays = 0;
while (true) {
  minusDays++;

  // Day increasing by 1
  beginCalendar.add(Calendar.DAY_OF_MONTH, 1);

  if (dateFormat.format(beginCalendar.getTime()).
            equals(dateFormat.format(endCalendar).getTime())) {
    break;
  }
}
System.out.println("The substractation between two days is " + (minusDays + 1));

Haben Sie Spaß! @. @

Ich bin nicht einverstanden mit der Behauptung, dass Java keinen Mechanismus zur Berechnung der Differenz zwischen diesen Zeitpunkt hat.

Java wurde für den weltweiten Einsatz konzipiert. Es wurde so konzipiert, dass es kein Konzept mehr aktuell ist, gibt es nur ein Konzept der „Zeit in Millisekunden“. Jede Auslegung einer solchen Weltzeit als die Zeit und Datums an einem bestimmten Ort unter einer bestimmten Konvention ist nur eine Projektion oder eine Ansicht.

Die Kalender-Klasse wird verwendet, diese Art der absoluten Zeit in Daten zu machen. Sie können auch aktuelle Komponenten addieren oder subtrahieren, wenn Sie wirklich brauchen. Die einzige Möglichkeit, einen Unterschied in der Bezeichnung der Komponenten zwischen zwei Zeiten Kalender würden bereitzustellen erzeugt und spezifisch. So könnte man argumentieren, dass die Standard-Bibliothek nicht intelligent genug, um gregorianischen Kalender enthält, und ich würde zustimmen, dass es einige zu wünschen übrig lässt.

Davon abgesehen, gibt es zahlreiche Implementierungen dieser Art von Funktionalität, wie ich sehe haben andere Beispiele.

Java-Implementierung von Terminen ist schlecht. Wenn Sie finden, Joda-Time zu kompliziert , versuchen Sie meinen kleinen Beitrag Quelle zu öffnen: http://calendardate.sourceforge.net/javadoc/index.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top