Apps für Android programmieren leicht gemacht!

Differenz in Tagen, Monaten und Jahren berechnen

Ich habe mich heute mal im Sinne einer kleinen App für mich und meine Freundin mit der Thematik der zeitlichen Differenz zwischen zwei Daten beschäftigt.
Konkret sollte meine App eine zeitliche Differenz in Jahren, Monaten und Tagen errechnen zwischen einem in der Vergangenheit liegendem Datum und dem heutigen Datum.

Am besten natürlich in Jahren, Monaten und Tagen.
Wir haben hierzu die Unix Zeit in Sekunden seit dem 1.1.1970 um 0:00 Uhr zur Verfügung.
Die Sekunden, Minuten, Stunden und Tage zu errechnen ist hier nicht das Problem. Auch die Wochen sollte man ganz einfach über die Differenz in Sekunden errechnen können.

// z. B. Minuten:
int volleMinutenSeit = (heutigeUnix - damaligeUnix) / 60;

// z. B. Stunden:
int volleStundenSeit = (heutigeUnix - damaligeUnix) / 3600;

// z. B. Tage:
int volleTageSeit = (heutigeUnix - damaligeUnix) / 86400;

Das erste Problem ist jetzt aber, dass alle drei Variablen nun mehr oder weniger die selbe lange Zeitspanne enthalten.
Sind die beiden Zeiten nun 2 Tage, 1 Stunde und 5 Minuten von einander entfernt, dann enthalten die Variablen 2.945 (die volle Zeit in Minuten), 49 (fast die volle Zeit in Stunden) und 2 (ungenaue Differenz in Tagen).
Ihr seht was wir in den Variablen aber gerne haben stehen wollen ist volleMinutenSeit = 5, volleStundenSeit = 1 und volleTageSeit = 2.

Wie machen wir das nun?
Nun ja, wir könnten einfach als erstes die vollen Tage berechnen, davon die restlichen Sekunden von der heutigen Unix subtrahieren und mit der neuen Unix die Stunden berechnen.
Von den berechneten vollen Stunden bleibt wahrscheinlich wieder ein Rest, aus dem wir die restlichen Minuten errechnen, usw.

int volleTageSeit = (heutigeUnix - damaligeUnix) / 86400;

heutigeUnix = heutigeUnix - (volleTageSeit % 86400);

int volleStundenSeit = (heutigeUnix - damaligeUnix) / 3600;

heutigeUnix = heutigeUnix - (volleStundenSeit % 3600);

int volleMinutenSeit = (heutigeUnix - damaligeUnix) / 60;

Die drei Variablen enthalten nun die gewünschten Inhalte.

 

Jahre, Monate, Tage

Alles schön und gut, aber wo bleiben die Jahre, Monate und Tage?

Nun, ich habe gerade viel um den heißen Brei herumgeredet. Bitte entschuldigt das, aber ich wollte auf etwas hinaus.
Wir können nun also alles berechnen, was der Größe Wochen oder kleiner entspricht, aber wie sieht es mit Monaten aus?

Wir haben soeben mit Sekunden gerechnet.
Mit Tagen und kleiner funktioniert das super, denn die haben eine recht stabile Länge.
Monate eben nicht!
Mal haben sie 30 Tage (30 • 86400 Sekunden pro Tag), mal haben sie 28 Tage (28 • 86400 Sekunden pro Tag).

Was tun?
Ich würde empfehlen die Library JodaTime zu nutzen. Diese berechnet uns ganz einfach und ohne weitere zutun die Differenz in Jahren, Monaten und Tagen.
JodaTime übernimmt auch die Berechnung der Monatslänge und wir sparen uns viel Arbeit.

Drei kleine Schritte sind nötig.
Öffnet als erstes die Datei „build.gradle (Module: app)“ und fügt unter Dependencies hinzu:

compile group: 'joda-time', name: 'joda-time', version: '2.3'

Führt nun einen Gradle Sync aus und schon könnt ihr die Library benutzen.

 

Der Code ist wie folgt:

//Heutige Unix Zeit in Millisekunden
Date now = new Date();
now.setTime(System.currentTimeMillis());

//Damalige Zeit in Millisekunden. (Das L am Ende sagt, dass die Zahl vom Typ Long ist)
Date firstKiss = new Date();
firstKiss.setTime(1476396000000L);

//Differenz berechnen lassen. "PeriodType.yearMonthDay()" beschreibt die Genauigkeit.
Period period = new Period(new DateTime(firstKiss), new DateTime(now), PeriodType.yearMonthDay());

//Differenz auslesen
int jahre = period.getYears();
int monate = period.getMonths();
int tage = period.getDays();

 

Bitte beachtet die Lizenzen von JodaTime.
Hier geht es zur Webseite: http://www.joda.org/joda-time/

 

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld