Reisezeiten ermitteln

andi_j62

Mitglied
Hallo Zusammen,

ich habe ein kleines Problem und weiss momentan nicht wie ich es lösen kann....

Für eine Reisekostenabrechnung habe ich das Startdatum mit Uhrzeit und das Enddatum mit Uhrzeit zur Verfügung. Jetzt gibt es 3 verschiedene Zeitblöcke, die immer auf 24:00 gerechnet werden müssen und zwar 24h, 14h und 8h. Immer wenn einer dieser 3 Zeitblöcke erreicht wird muss der jeweilige Bereichszähler um 1 erhöht werden.

Beispiel 1:
Startdatum 01.07.2010 16 Uhr
Enddatum 03.07.2010 14 Uhr

Das Ergebnis müsste jetzt sein:
1 x 8Std (16 Uhr - 24 Uhr)
1 x 24Std (24 Uhr - 24 Uhr)
1 x 14 Std (24 Uhr - 14 Uhr)

Beispiel 2:
Startdatum: 01.10.2010 16 Uhr
Enddatum: 02.10.2010 14 Uhr

Das Ergebnis müsste jetzt sein:
1 x 8 Std (16 Uhr - 24 Uhr)
1 x 14 Std (24 Uhr - 14 Uhr)

Ich hoffe ich konnte es erklären.

Wäre super wenn mir hier jemand mit einer Routine auf die Sprünge helfen könnte!

Viele Grüße
Andi
 
Ich habe wohl deinen Ansatz überlesen ... Mache dir doch erstmal alle Methoden, die du brauchst:

Code:
- blockzaehler : int[3]
- startDatum : String
- endDatum: String

+ getStartTag() : int
+ getStartMonat() : int
+ getStartJahr() : int
+ getStartStunde() : int

+ getEndTag() : int
+ getEndMonat() : int
+ getEndJahr() : int
+ getEndStunde() : int

+ getAnzahlTage() : int
+ getStunden(tag: int) : int

+ ausgeben() : void

Wegen deinen mangehaften Informationen, weis ich nicht, was du alles brauchst/hast. Ich gehe mal davon aus, dass das Datum im Stringformat vorliegt. Dann kannst du mit der Methode substring und parseInt alles erledigen.
 
Zuletzt bearbeitet:
Mit welchen Klassen arbeitest Du? java.util.Calendar bietet Möglichkeiten einzelne Informationen aus einem Datum auszulesen. Sind die Bereich fest? Was ist wenn ein Termin um 15 Uhr anfängt/endet, zählt das dann zum 14h/24h Bereich?
 
Da ich kürzlich was ähnliches brauchte, hab ich die Lösung einfach mal deinen Anforderungen angepasst. Allerdings ist dort noch keine Sonderbehandlung drin, wie die von Michael angesprochen. Stunden können hierbei über bleiben. Ist nicht besonders elegant gelöst, aber sollte dir zumindest einen soliden Ansatz geben.

Java:
package timedifferenz;

import java.util.GregorianCalendar;

public class TimeDifferenz
{
  private static int ANZAHL_VIERUNDZWANZIG = 0;
  private static int ANZAHL_VIERZEHN       = 1;
  private static int ANZAHL_ACHT           = 2;

  /**
   * @param firstDate
   * @param secondDate
   * @return Array mit Anzahl ANZAHL_VIERUNDZWANZIG, ANZAHL_VIERZEHN, ANZAHL_ACHT
   */
  public int[] calculateDifferenz( GregorianCalendar firstDate, GregorianCalendar secondDate )
  {
    int[] array = new int[3];
    array[ 0 ] = 0;
    array[ 1 ] = 0;
    array[ 2 ] = 0;

    long difference = secondDate.getTimeInMillis() - firstDate.getTimeInMillis();

    //Millisekunden in Stunden umzuwandeln: / 1000 (Sekunden) / 60 (Minuten) / 60 (Stunden).
    int hours = (int) (difference / (1000 * 60 * 60));

    while ( hours >= 24 )
    {
      array[ ANZAHL_VIERUNDZWANZIG ] = array[ ANZAHL_VIERUNDZWANZIG ] + 1;
      hours = hours - 24;
    }
    while ( hours >= 14 )
    {
      array[ ANZAHL_VIERZEHN ] = array[ ANZAHL_VIERZEHN ] + 1;
      hours = hours - 14;
    }
    while ( hours >= 8 )
    {
      array[ ANZAHL_ACHT ] = array[ ANZAHL_ACHT ] + 1;
      hours = hours - 8;
    }

    return array;
  }

  public static void main( String[] args )
  {
    //    Startdatum: 01.10.2010 16 Uhr
    //    Enddatum: 02.10.2010 14 Uhr

    GregorianCalendar firstDate1 = new GregorianCalendar( 2010, 10, 01, 16, 0 );

    GregorianCalendar secondDate1 = new GregorianCalendar( 2010, 10, 02, 14, 0 );

    TimeDifferenz calculator = new TimeDifferenz();

    int[] result = calculator.calculateDifferenz( firstDate1, secondDate1 );

    System.out.println( "24 Stunden: " + result[ ANZAHL_VIERUNDZWANZIG ] );
    System.out.println( "14 Stunden: " + result[ ANZAHL_VIERZEHN ] );
    System.out.println( " 8 Stunden: " + result[ ANZAHL_ACHT ] );

    System.out.println( "--------------" );
    //    Startdatum 01.07.2010 16 Uhr
    //    Enddatum 03.07.2010 14 Uhr

    GregorianCalendar firstDate2 = new GregorianCalendar( 2010, 07, 01, 16, 0 );

    GregorianCalendar secondDate2 = new GregorianCalendar( 2010, 07, 03, 14, 0 );

    int[] result2 = calculator.calculateDifferenz( firstDate2, secondDate2 );

    System.out.println( "24 Stunden: " + result2[ ANZAHL_VIERUNDZWANZIG ] );
    System.out.println( "14 Stunden: " + result2[ ANZAHL_VIERZEHN ] );
    System.out.println( " 8 Stunden: " + result2[ ANZAHL_ACHT ] );
  }
}

Grüße,
ymene
 
Nicht ganz,
Du hast in Deinem long difference die angebrochenen Stunden des ersten und des letzten Tages mit drin
Bei. z.B. 01.07.xx 14 Uhr bis 02.07.xx 14 Uhr
würde bei Dir 1 x 24h rauskommen.
Er will aber 2x14h oder 1x8h + 1x14h, je nach dem ob die 10 Stunden des ersten Tages auf 14 aufgerundet oder auf 8 abgerundet werden sollen. (Wenn ich das richtig verstanden habe)
 
Hallo Zusammen,

Danke für die Denkansätze. Michael hat recht, es muss immer auf bzw. ab 24 Uhr gerechnet werden, 1x24 Std kann nur rauskommen wenn die Reise über 3 Tage geht, wie bei meinem Beispiel 1.

ymene es wäre super wenn Du Dein Beispiel vielleicht dahingehend noch mal überarbeiten könntest.
 
Zuletzt bearbeitet:
Du hast noch keinen Deut zu DEINER Aufgabe beigetragen und jetzt willst du auch noch, als man dir schon fast die Lösung bringt, das man diese auch noch an deine genauen Bedürfnisse anpasst. Versuche doch mal selbst etwas zu leisten und wenn du konkrete Probleme hast, steht man dir wieder gerne zur Verfügung.
 
Hallo Eldorado,

wenn ich es wüsste wie es geht, hätte ich keine Anfrage gestellt. So wie das Beispiel von ymene ist, habe ich es auch schon hingebracht. Aber mein Problem liegt eben daran dass ich nicht weiss wie ich es immer auf bzw ab 24 Uhr rechnen kann.

Viele Grüße
Andi
 
Woran hängt's denn? Am Algorithmus oder am Umsetzen in Java Code?
Eigentlich muss du nur den Stundenanteil des Starttermins nehmen und diesen von 24 abziehen, dann hast Du die Stunden des ersten Tages und bewertest diese entsprechend (kann Start und Ende auf den selben Tag fallen?)
Beim Endtermin muss Du nur den Stundenanteil auslesen und bewerten
Um die Anzahl der vollen Tage zu bestimmen musst Du die beiden ersten Werte von der Gesamtdifferenz abziehen.
Java:
int hoursFirstDay = 24 - stundenAnteildesStartdatums;
int hoursLastDay = stundenAnteildesEnddatums;
long difference = secondDate.getTimeInMillis() - firstDate.getTimeInMillis();
int fullDays = (delta / 1000 / 60 / 60 - hoursFirstDay - hoursLastDay) / 24;
 
Hallo Michael,

danke für den Tipp! Ich war irgendwie auf dem Schlauch gestanden da ich immer Tag + Uhrzeit in Millisekunden umgerechnet habe und keine Idee hatte wie man das dann anteilig auf die Tage umrechnen kann. Wenn man die Stunden getrennt rechnet funktioniert das deutlich einfacher.

Ich werde es gleich mal probieren.
 

Zurück
Oben