Tagesdifferenz zw. 2 Gregorian Objekten

  • Themenstarter Themenstarter gdfgfd
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

gdfgfd

Gast
Ich moechte die TAGESdifferenz zwischen zwei GregorianCalendar Objekten berechnen, wie geht das?
 
Hier mal die Berechnung in Minuten:

Code:
GregorianCalendar start = new GregorianCalendar();
GregorianCalendar ende = new GregorianCalendar();
start.setTime(Startzeit);
ende.setTime(Endzeit);
long diff = ((ende.getTimeInMillis()-start.getTimeInMillis()) / 1000) / 60;

Der Rest sollte eigentlich kein Problem sein.
 
Danke!

Aber mein Problem besteht weiter!
Es sieht so aus: Wenn heute 14 Uhr ist und ich morgen ein Datum + Uhrzeit auf 9 Uhr morgens setze, dann ist die Tagesdifferenz 0, weil ja auch kein ganzer Tag dazwischen liegt...

Demnach soll er sich einfach nur die Tage/ Monate/ Jahre ansehen und danach rechnen.

Wie geht das?
 
long diff ist die Zeit in Millisekunden,
statt in Minuten kannst du die auch in ganze Tage umrechnen,
wie das geht dürfte doch wohl klar sein, oder ist das die Frage?

wenn du dann 0.7 Tage hast, kann du das ja gerne auf 0 Tage runden
 
Aber das Prob liegt doch woanders!

Man stelle sich vor:

Jetzt: 23 Uhr

Morgen: 1 Uhr morgens

Dann kommt als Differenz durch das Teilen usw. etwas raus, was kleiner ist als 1, und zum runden auch nicht mehr auf 1 zu bringen ist ... An diesem Punkt soll er aber auf 1 kommen, weil der Termin MORGEN ist...

Naechste Situation:

Jetzt: 12 Uhr

Nachher: 14 Uhr

Als Zeitdifferenz kommt das gleiche raus wie oben, doch er soll es auf 0 bringen... Weil der "Termin" noch heute ist.

Also muss ich das nur anhand der Tage berechnen ... Also, ... wie geht DAS?
 
ah, nun hab ichs kapiert 😉

nun, dazu gibts nichts vorgefertigtes mehr zu berücksichtigen,
du hast ja Calendar-Objekte und fragst diese nach Tagen/ Monaten oder sonstwas ab,

für Tag 4 und Tag 5 ist die Differenz 1, subtrahieren musst du schon selber

über mehrere Monate oder gar Jahre wird das etwas schwierig wenn man etwa Anzahl Tage pro Monat/ Jahr (Schaltjahr) berücksichtigen muss,

immerhin gibt dir der Calendar noch den Tag im Jahr zurück
(siehe API für alle Möglichkeiten), falls du Tagesdifferenzen über Monatsgrenzen brauchst
 
Ich hatte gesehen, dass man vielleicht mit SimpleDateFormat machen koennte? Weil da kann man vielleicht ein Date erzeugen, was nur das Datum beinhaltet...
Dann berechnet man so auch wieder die differenz und erhaelt den abstand der Tage...

Aber ich weiss echt nicht wie und dachte, dass ihr so vielleicht was machen koenntet?
 
> Weil da kann man vielleicht ein Date erzeugen, was nur das Datum beinhaltet

genausogut kannst du im Calendar die Stunden, Minuten und Sekunden auf 0 setzen

oder wie gesagt direkt die Tage abfragen und subtrahieren,
dabei aber wie gesagt auf Monats- und Jahreswechsel achten,

dann ist die Differenzberechnung nach Löschen der Stunden usw. wirklich eine respektable Alternative, stimmt
 
Na gut, dann mach ich das jetzt mit dem Stunde auf 0 setzen...

Aber: Ich brauche ja immer ein aktuelles Gregorian-Objekt... Das hol ich mir mit new GregorianCalendar()
Das beinhaltet aber auch schon die aktuellen Stunden usw., die ich danach auch wieder auf 0 setzen muesste. Kann man das vielleicht unterbinden, dass man nur das aktuelle Datum bekommt?
 
ich denke nicht, ist doch schnell gemacht, evtl. in einer statischen Operation versteckt,
wenn es das irgendwo gäbe, dann würde es dort in der API genauso ablaufen,
was macht das groß für einen Unterschied?
 
Meine Methode sieht jetzt so aus:

Code:
  public long getRemainingDays (  ) {
    // Returns the time between now and the appointment in days
    GregorianCalendar gcNow = new GregorianCalendar();
    gcNow.set(Calendar.HOUR_OF_DAY, 0);
    gcNow.set(Calendar.MINUTE, 0);
    gcNow.set(Calendar.SECOND, 0);
    gcNow.set(Calendar.MILLISECOND, 0);
    
    GregorianCalendar gcAppointment = new GregorianCalendar(getYear(), getMonth() - 1, getDay());

    //  Datum hat schon alle Zeitlichen Angaben auf 0
    //  gcAppointment.set(Calendar.HOUR_OF_DAY, 0);
    //  gcAppointment.set(Calendar.MINUTE, 0);
    //  gcAppointment.set(Calendar.SECOND, 0);
    //  gcAppointment.set(Calendar.MILLISECOND, 0);

    double dobDifference = ((double) (gcAppointment.getTimeInMillis() - gcNow.getTimeInMillis())) / 24 / 60 / 60 / 1000;
    
    System.out.println(dobDifference);
    
    return (long) dobDifference;
  }

** Zum testen setzt ihr einfach fuer gcAppointment das Datum ein, zu dem zu heute der Abstand gemessen werden soll **

Üroblem: Ich hab bis 5 Tagen Diff. kein Prob, aber ab 6 Tagen kommt fuer dobDifference ein Wert von 5,99732328 oder so aehnlich raus und demnach rundet er ab auf 5 ... also ist es falsch ... runden kann ich auch nicht, weil es sonst unsicher wird bei laengeren abstaenden...

also was kann ich machen?
 
addiere 12 Stunden drauf (0.5 Tage) bevor du abrundest,

so hast du auch kein Problem, wenn Java dir wegen Sommer/ Winterzeit mal 5.1 oder 4.9 Tage ausrechnet mit einer echten Abweichung von einer Stunde (ist weniger als 0.1 Tage, ich weiß)

und schreibe

double dobDifference = (gcAppointment.getTimeInMillis() - gcNow.getTimeInMillis()) / MILLI_FOR_DAY;
mit einer static double Konstante MILLI_FOR_DAY

statt
double dobDifference = ((double) (gcAppointment.getTimeInMillis() - gcNow.getTimeInMillis())) / 24 / 60 / 60 / 1000;
 
Gut, ich habs so gelassen.
Selbst mit einer Differenz von 10 Jahren kommt er immer auf x.9564364 ...

Demnach hab ich jetzt einfach nur noch das Runden eingefuegt und es bis auf 30 Tage Zeitdifferenz erfolgreich getestet.

Code:
  public long getRemainingDays (  ) {
    // Returns the time between now and the appointment in days
    GregorianCalendar gcNow = new GregorianCalendar();
    gcNow.set(Calendar.HOUR_OF_DAY, 0);
    gcNow.set(Calendar.MINUTE, 0);
    gcNow.set(Calendar.SECOND, 0);
    gcNow.set(Calendar.MILLISECOND, 0);
    
    GregorianCalendar gcAppointment = new GregorianCalendar(getYear(), getMonth() - 1, getDay());

    //  Datum hat schon alle Zeitlichen Angaben auf 0
    //  gcAppointment.set(Calendar.HOUR_OF_DAY, 0);
    //  gcAppointment.set(Calendar.MINUTE, 0);
    //  gcAppointment.set(Calendar.SECOND, 0);
    //  gcAppointment.set(Calendar.MILLISECOND, 0);

    return Math.round(((double) (gcAppointment.getTimeInMillis() - gcNow.getTimeInMillis())) / 24 / 60 / 60 / 1000);
  }

Danke sehr!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben