zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Zeitdifferenzen berechnen ohne Jahr

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 25.08.2011, 11:51
Benutzerbild von kampfgnom
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.11.2006
Ort: Radebeul
Beiträge: 1.808
kampfgnom befindet sich auf einem aufstrebenden Ast
Standard Zeitdifferenzen berechnen ohne Jahr

Hallo,
ich war zwar lange nicht mehr hier, hab aber mal wieder ein Frage

Es geht um die Differenzen von Daten (also wie viele Tage liegen zwischen zwei Daten). Das Problem:
Die Daten liegen ohne Jahr vor (bzw. das sollte sie, da es sich wiederholende Daten sind - genauer: Saisons)

Ich bin nun mittlerweile schon so weit, dass alles funktioniert, solange man im gleichen Jahr Anfängt zu buchen.
Das Problem liegt immer am Jahr, da ich dass eigentlich ignorieren muss, aber um die Zeitfunktionen von PHP zu nutzen, jedesmal dazu schreiben muss.
Mein bisheriger Ansatz sieht folgendermaßen aus:
PHP-Code:
protected function calcdays($start$ende$cid){
        
// Alle Saisons des Zelplatzes holen:
        
$saisonkat ORM::factory("saisonkategorie")
                                        ->
where("campingplatz_id""="$cid)
                                        ->
and_where("deleted""="0)    
                                        ->
find_all();
        
$saved false;
        foreach (
$saisonkat as $saison) {
            
//Daten der Datenbank in valide Daten umwandeln
            
$saison->start date("Y").substr($saison->start,4);
            
$saison->end date("Y").substr($saison->end,4);
            
            
            if(
strtotime($saison->start) < time() && strtotime($saison->end) < time()){
                
//Die Saison liegt "komplett in der Vergangenheit"
                
$saison->start = (date("Y")+1).substr($saison->start,4);
                
$saison->end = (date("Y")+1).substr($saison->end,4);
            }elseif(
strtotime($saison->start) > time() && strtotime($saison->end) < time()){
                
//Nur das Ende liegt in der Vergangenheit => Saison über Jahreswechsel
                
$saison->end = (date("Y")+1).substr($saison->end,4);
            }
            
$t = (strtotime($saison->end)-strtotime($saison->start))/86400;
            
            
            if(
strtotime($saison->start) < strtotime($start) &&
                
strtotime($saison->end) > strtotime($start)){
                
//Startdatum liegt in der saison:
                
if(!$saved){
                    
$sais[] = $saison;
                    
$saved true;
                }
            }
            if(
strtotime($saison->start) > strtotime($start) &&
                
strtotime($ende) > strtotime($saison->end)
                ){
                
//Saison liegt in beiden Daten
                
if(!$saved){
                    
$sais[] = $saison;
                    
$saved true;
                }
            }
            if(
strtotime($ende) < strtotime($saison->end) &&
                
strtotime($ende) > strtotime($saison->start)){
                
//Enddatum liegt in der Saison
                
if(!$saved){
                    
$sais[] = $saison;
                    
$saved true;
                }
            }
                
            
$t_start strtotime($start);
            
$t_start_y date("Y"$t_start);
            
            
$t_end strtotime($ende);
            
$t_end_y date("Y"$t_end);
            
            if(
$t_start_y != date("Y")){
                
Kohana::$log->add(6"Startjahr ($saison->name) differenz: {$t_start_y}");
            }
            
            if(
$t_end_y != date("Y")){
                
Kohana::$log->add(6"Endjahr ($saison->name) differenz: {$t_end_y}");    
            }
            
            
$saved false;
        }

        
//Anzahl der Tage pro Saison errechnen
        
$return = array();
        
Kohana::$log->add(6,"------------------------------");
        
Kohana::$log->add(6,"Reise von {$start} bis {$ende}");
        
Kohana::$log->add(6"Saisonanzahl: ".count($sais));
        switch(
count($sais)){
            case 
1:            //Eine Saison nur vorhanden. Anzahl Tage = Ende-Start
                
$days = (strtotime($ende)-strtotime($start))/86400;
                
$return[0]['days'] = $days+1;
                
$return[0]['saison'] = $sais[0];
                break;
            case 
2:         //Start und Ende liegen jeweils in getrennten Saisons
                
$day_s_1 = (strtotime($sais[0]->end)-strtotime($start))/86400;
                
$day_s_2 = (strtotime($ende)-strtotime($sais[1]->start))/86400;
                
$return[0]['days']         = $day_s_1+1;
                
$return[0]['saison']     = $sais[0];
                
$return[1]['days']        = $day_s_2+1;
                
$return[1]['saison']    = $sais[1];
                break;
            default:    
//Es gibt mehr als 2 Saisons
                
$day_s_1 = (strtotime($sais[0]->end)-strtotime($start))/86400// Erste Saison
                
$return[0]['days']         = $day_s_1+1;
                
$return[0]['saison']     = $sais[0];
                for(
$i =1$i<count($sais)-1$i++){ // Alle mittleren Saisons durchgehen
                    
$days = (strtotime($sais[$i]->end)- strtotime($sais[$i]->start))/86400;
                    
$return[$i]['days'] = $days+1;
                    
$return[$i]['saison'] = $sais[$i];
                }
                
$day_s_last = (strtotime($ende)-strtotime($sais[count($sais)-1]->start))/86400;
                
$return[count($sais)-1]['days'] = $day_s_last+1;
                
$return[count($sais)-1]['saison'] = $sais[count($sais)-1];
        }
        foreach(
$return as $_s){
            
Kohana::$log->add(6," calc Saison: ".$_s['saison']->name." Tage in Saison: ".$_s['days']);    
        }
        return 
$return;
    } 
Das ganze Projekt basiert auf Kohana, aber das sollte bei der Berechnung nicht stören.
Der Saisonbeginn steht in $->start und das ende log. in $->end
Die Parameter sind das Startdatum ($start), das $enddatum($end) und eine Datenbank-Id die zur berechnung nicht weiter von interesse ist

Es wäre wirklich super, wenn ihr mir da helfen könntet!
__________________
Meine Spielwiese: http://blog.kanedo.net
Ich bei Flickr? Da: Flickr: Fotostream von kanedo-projekt
Für open Source Liebhaber: open Com

Auch ich Zwitschere als @kanedo
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 25.08.2011, 12:01
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 12.07.2009
Beiträge: 969
rs-web befindet sich auf einem aufstrebenden Ast
Standard

Ohne jetzt den Code gelesen zu haben: Eine Session ist nie länger als ein Jahr? Wenn ja, könntest du ja einfach das aktuelle Jahr - 1 rechnen, dann hast du wieder eine Jahreszahl.

Aber warum musst du das Jahr ignorieren?
__________________
Small boy wrote to Santa Claus:"Send me a brother!" Santa wrote back: "Send me your mother"
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 25.08.2011, 12:07
Benutzerbild von kampfgnom
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.11.2006
Ort: Radebeul
Beiträge: 1.808
kampfgnom befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von rs-web Beitrag anzeigen
Ohne jetzt den Code gelesen zu haben: Eine Session ist nie länger als ein Jahr? Wenn ja, könntest du ja einfach das aktuelle Jahr - 1 rechnen, dann hast du wieder eine Jahreszahl.
Ja, aber wieso -1?
Was ist denn zum Beispiel, wenn die Saison von 1.8-30.9 geht und du jetzt die Reise vom 26.08.2011 - 2.09.11 machst, dann würde das mit Jahr-1 nicht mehr hinhauen, oder versteh ich das falsch
Zitat:
Zitat von rs-web Beitrag anzeigen
Aber warum musst du das Jahr ignorieren?
Das jahr muss ich ignorieren, weil die Saisons unabhängig vom Jahr sind - die gibt es jedes Jahr
__________________
Meine Spielwiese: http://blog.kanedo.net
Ich bei Flickr? Da: Flickr: Fotostream von kanedo-projekt
Für open Source Liebhaber: open Com

Auch ich Zwitschere als @kanedo
Mit Zitat antworten
  #4 (permalink)  
Alt 25.08.2011, 12:16
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Ich würde einfach das jeweils aktuelle Datum dran hängen. Es geht doch darum, ob die "Saison" schon erreicht ist und die Buchung für diese "Saison" eröffnet werden kann bzw. geschlossen werden muss.
Mit Ausnahme des 29.2. kommt ja jedes Datum jedes Jahr vor, so sollte das kein Problem werden.

Oder habe ich die Frage falsch verstanden?
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!
Mit Zitat antworten
  #5 (permalink)  
Alt 25.08.2011, 12:24
Benutzerbild von kampfgnom
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.11.2006
Ort: Radebeul
Beiträge: 1.808
kampfgnom befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Praktikant Beitrag anzeigen
Ich würde einfach das jeweils aktuelle Datum dran hängen.
Das dachte ich mir auch schon. Nur gibt es dann den Fall, dass jemand seine Reise erst im nächsten Jahr macht, dann gibt's gar keine Saisons mehr

Bisher mache ich es so. Ich nehme das aktuelle Jahr. Dann prüfe ich, ob sowohl start als auch end datum vor dem aktuellen liegen, wenn ja: dann erhöhe ich das jahr um 1

Jetzt bleibt eben nur noch das problem was passiert wenn das aktuelle Jahr, nicht mit dem der Reise übereinstimmt. Was passiert wenn jmd mal mehr als 1 Jahr verreisen möchte (unwahrscheinlich, aber kann ja passieren...)
__________________
Meine Spielwiese: http://blog.kanedo.net
Ich bei Flickr? Da: Flickr: Fotostream von kanedo-projekt
Für open Source Liebhaber: open Com

Auch ich Zwitschere als @kanedo
Mit Zitat antworten
  #6 (permalink)  
Alt 25.08.2011, 12:33
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Wenn jemand mehr als ein Jahr verreisen will, dann passt das aber nicht mehr in die Saison.

Du sagtest ja bereits, dass es die Saisons jedes Jahr gibt. Die Daten bleiben anscheinend dieselben, sonst würden ja die Jahreszahlen mit dran hängen.
Plant jetzt jemand im nächsten Jahr, so findet die Saison da ja auch wieder statt. Du musst also einfach prüfen ob die Saison zutrifft und dann das entsprechende Jahr buchen.
Die Jahreszahl würde ich an die Saison hängen. Du musst ja auch prüfen ob in der gebuchten Saison (inkl. Jahreszahl) noch etwas frei ist. Du kannst daher problemlos die Jahreszahl an die Saison hängen. Wenn die Saisons dann ändern, sollte das halt früh genug bekannt sein, sodass entsprechend die Saisons umgeschrieben werden können.

Ist es egal, wann die Person zurück kommt? Wenn jemand mehr als ein Jahr am gleichen Platz bleibt, dann musst du Reise halt in der Startsaison und in den darauf folgenden und ebenfalls benötigten Saisons buchen.

Ich verstehe allerdings immer noch nicht 100% des Problems, was aber daran liegen kann, dass der Ausschnitt den ich kenne sehr gering ist
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!
Mit Zitat antworten
  #7 (permalink)  
Alt 25.08.2011, 12:46
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 12.07.2009
Beiträge: 969
rs-web befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Praktikant Beitrag anzeigen
Ich verstehe allerdings immer noch nicht 100% des Problems, was aber daran liegen kann, dass der Ausschnitt den ich kenne sehr gering ist
Ich irgendwie auch nicht.
__________________
Small boy wrote to Santa Claus:"Send me a brother!" Santa wrote back: "Send me your mother"
Mit Zitat antworten
  #8 (permalink)  
Alt 25.08.2011, 13:38
Benutzerbild von kampfgnom
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.11.2006
Ort: Radebeul
Beiträge: 1.808
kampfgnom befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von rs-web Beitrag anzeigen
Ich irgendwie auch nicht.
Ok ich versuchs noch einmal anders zu klären.
Es geht um eine Reise. Bei der Berechnung des Preises gibt es verschiedene Saisons.
Diese werden im Format TT.MM angegeben.
Ich habe also ein Start-Datum der Reise im Format TT.MM.JJJJ und ein Enddatum im gleichen Format.

Die Aufgabe besteht darin, herauszufinden, wie viele Tage der Reise in welcher Saison liegen.

Das große Problem liegt nun im fehlenden Jahr der Saisons. Beginnt die Reise im aktuellen Jahr, funktioniert der Quellcode oben. Aber beginnt sie später, oder die Reise länger als ein Jahr (d.h. eine Saison kommt mehrmals vor), versagt der "Algorithmus"

Ist das jetzt verständlicher? Ich glaube ich hab selbst noch nicht komplett durchgeblickt...
__________________
Meine Spielwiese: http://blog.kanedo.net
Ich bei Flickr? Da: Flickr: Fotostream von kanedo-projekt
Für open Source Liebhaber: open Com

Auch ich Zwitschere als @kanedo
Mit Zitat antworten
  #9 (permalink)  
Alt 25.08.2011, 14:46
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 745
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Können sich die Preise oder die Saison-Daten (Anfang, Ende) nicht von Saison zu Saison verändern? Das System mit den festen Saisonangaben erscheint mit unflexibel.
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 25.08.2011, 15:02
Benutzerbild von kampfgnom
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 22.11.2006
Ort: Radebeul
Beiträge: 1.808
kampfgnom befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Können sich die Preise oder die Saison-Daten (Anfang, Ende) nicht von Saison zu Saison verändern? Das System mit den festen Saisonangaben erscheint mit unflexibel.
Das ist irrelevant, da die aktuellen Daten genutzt werden und dann in einer extra-relation gespeichert werden (hat was mit der Buchung zutun...) aber die Preise können jederzeit angepasst werden.
Das Saison-Model ist außerdem eines, was sehr häufig bei Reiseanbietern praktiziert wird (Im Sommer zahl man immer mehr als im Winter)
__________________
Meine Spielwiese: http://blog.kanedo.net
Ich bei Flickr? Da: Flickr: Fotostream von kanedo-projekt
Für open Source Liebhaber: open Com

Auch ich Zwitschere als @kanedo
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Höhe eines Elements berechnen und woanders zuweisen micronix Javascript & Ajax 3 19.04.2011 23:48
Vertikale CSS Navigation mit Bildern und Text macmensa CSS 2 25.07.2009 17:23
Uhrzeiten berechnen IronThunder Javascript & Ajax 4 04.07.2007 12:41
Vista läuft ein Jahr ohne Aktivierung kadees Offtopic 6 19.03.2007 19:41
Werte berechnen? (Breite/Höhe, Abstand, ...) neurologic scientist CSS 6 13.09.2006 18:56


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:54 Uhr.