Jnnbo: Verbleibende Tage / Stunden anzeigen

Moin,

ich stehe vor einem kleinen Problem. In meiner Datenbank (die Daten bekomme ich geliefert) steht ein Datum dieses so aussieht: 04.03.2015 ausgelesen wird es so: <?php echo htmlspecialchars($array['start']); ?>. Nun gibt es ein weiteres Feld mit Tage, dort steht eine einfache Zahl drin, z.B. "14" für 14 Tage. Dieses Feld wir so ausgelesen:  <?php echo htmlspecialchars($array['tage']); ?>.

Die Frage ist nun, wie kann ich auf meiner Ausgabeseite erreichen, dass der User folgende sieht:

Dieses Projekt läuft noch 14 Tage.

Die zweite Frage, wenn ich unter einem Tag bin, dann sollte stehen:

Dieses Projekt läuft noch 23h 10min. usw..

Ich hoffe beide sind mit diesen Daten, die ich jetzt habe möglich. Ansonsten müsste ich irgendwie die Daten in eine zwischen Tabelle speichern und umwandeln. Vielleicht könnt ihr mir bei diesem Problem etwas helfen.

  1. Moin,

    Dieses Projekt läuft noch 23h 10min. usw..

    Mit den richtigen Daten kannst Du auch sowas darstellen.

    MfG

    --
    Bedenke dass auch eine Suchmaschine mit den richtigen Suchbegriffen falsche Daten liefern kann.
  2. Hallo,

    Daten, die ich jetzt habe

    Die Frage ist, sieht es nur so aus als ob oder ist es für den Rechner ein Datum. Wenn ja, kann er auch damit rechnen. Schau mal z.B. ins Manual.

    Gruß Kalk

    1. Hallo,

      hab im Netz eine Lösung gefunden, dass man für eine kleine Berechnung ca. 40 Zeilen Code schreiben ist echt der Wahnsinn :/

      
      function makeDifferenz($first, $second)
      {
      	
      	if($first > $second)
      		$td['dif'][0] = $first - $second;
      	else
      		$td['dif'][0] = $second - $first;
      	
      	$td['sec'][0] = $td['dif'][0] % 60; // 67 = 7
      
      	$td['min'][0] = (($td['dif'][0] - $td['sec'][0]) / 60) % 60;
      	
      	$td['std'][0] = (((($td['dif'][0] - $td['sec'][0]) /60)- $td['min'][0]) / 60) % 24;
      	
      	$td['day'][0] = floor( ((((($td['dif'][0] - $td['sec'][0]) /60)- $td['min'][0]) / 60) / 24) );
      	
      	$td = makeString($td);
      	
      	return $td;
      	
      }
      
      function makeString($td)
      {
      	
      	if ($td['min'][0] == 1)
      		$td['min'][1] = 'Minute';
      	else
      		$td['min'][1] = 'Minuten';
      		
      	if ($td['std'][0] == 1)
      		$td['std'][1] = 'Stunde';
      	else
      		$td['std'][1] = 'Stunden';
      		
      	if ($td['day'][0] == 1)
      		$td['day'][1] = 'Tag';
      	else
      		$td['day'][1] = 'Tage';
      	
      	return $td;
      	
      }
      
      $secLast = time();
      $secNow = mktime ( 10, 53, 0, 3, 6, 2015 );
      
      $td = makeDifferenz($secLast, $secNow);
      
      if ($td['day'][0] < 1) {
      echo $td['std'][0] . ' ' . $td['std'][1] . ', ' . $td['min'][0] . ' ' . $td['min'][1]; 	
      }
      else {
      echo $td['day'][0] . ' ' . $td['day'][1] . ', ' . $td['std'][0] . ' ' . $td['std'][1] . ', ' . $td['min'][0] . ' ' . $td['min'][1];
      	}
      ?>
      
      

      Ich dachte eher dass MySQL so etwas direkt kann. Es funktioniert und alles andere soll mir erstmal egal sein.

      1. Die Frage ist jetzt wie bekomme ich mein Datum, das in der MySQL Datenbank so ausschaut "2015-03-06 10:53:00" in dieses Format? $secNow = mktime ( 10, 53, 0, 3, 5, 2015 );

        1. Om nah hoo pez nyeetz, Jnnbo!

          Die Frage ist jetzt wie bekomme ich mein Datum, das in der MySQL Datenbank so ausschaut "2015-03-06 10:53:00" in dieses Format? $secNow = mktime ( 10, 53, 0, 3, 5, 2015 );

          mit date()

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Horn und Hornisse. http://www.billiger-im-urlaub.de/kreis_sw.gif
      2. Tach!

        hab im Netz eine Lösung gefunden, dass man für eine kleine Berechnung ca. 40 Zeilen Code schreiben ist echt der Wahnsinn :/ Ich dachte eher dass MySQL so etwas direkt kann. Es funktioniert und alles andere soll mir erstmal egal sein.

        Ja, aber dazu muss es ein echtes Datumsfeld sein, dann hast du eine ganze Menge Funktionen zur Datumsberechnung, die du verwenden und im Handbuch beschrieben finden kannst. Du beschreibst immer nur das Aussehen, aber ob das ein formatiertes echtes Datum ist oder nur ein String, der wie ein Datum aussieht, kann man daraus nicht entnehmen. Was hast du für einen Feldtyp vorliegen?

        dedlfix.

        1. Tach,

          Ja, aber dazu muss es ein echtes Datumsfeld sein, dann hast du eine ganze Menge Funktionen zur Datumsberechnung, die du verwenden und im Handbuch beschrieben finden kannst. Du beschreibst immer nur das Aussehen, aber ob das ein formatiertes echtes Datum ist oder nur ein String, der wie ein Datum aussieht, kann man daraus nicht entnehmen. Was hast du für einen Feldtyp vorliegen?

          mein Feld in der Datenbank ist "datetime"und das Datum sieht so aus "2015-03-06 10:53:00"

          1. Tach!

            mein Feld in der Datenbank ist "datetime"und das Datum sieht so aus "2015-03-06 10:53:00"

            Wie es aussieht hängt von der eingestellten Formatierung ab. Das Aussehen ist für die Frage, ob man mit dem Datum rechnen kann, nicht von Belang. Wenn du nach dem Aussehen gehst, müsstest du erst das Datum in seine Bestandteile zerpflücken, um Rechnungen vornehmen zu können.

            Du hast also ein DateTime und nun stehen dir, wie schon erwähnt, alle Datumsfunktionen zur Verfügung, um deine gewünschten Berechnungen anstellen zu können.

            dedlfix.

            1. Tach,

              Du hast also ein DateTime und nun stehen dir, wie schon erwähnt, alle Datumsfunktionen zur Verfügung, um deine gewünschten Berechnungen anstellen zu können.

              dann habe ich dazu noch eine Frage, ist es denn besser wenn ich solche Berechnungen in MySQL durchführe oder später in PHP wenn ich es wirklich benötige?

              Für das erste Select habe ich es so umgesetzt: SELECT DATEDIFF(ende, NOW())AS Ende FROM projekt WHERE NOW()  < ende"

              Damit werden alle Einträge die das ende erreicht haben, nicht mehr angezeigt. Mein Problem weiter unten wo ich es dann darum geht, wie lange ein Projekt läuft also die Anzeige für den User, ist damit noch nicht gelöst. Da müsste ich dann wieder auf meinen PHP Code zurückgreifen?

              1. Tach!

                dann habe ich dazu noch eine Frage, ist es denn besser wenn ich solche Berechnungen in MySQL durchführe oder später in PHP wenn ich es wirklich benötige?

                Oder. In MySQL hast du das Datum als Datum vorliegen, MySQL kann damit rechnen. PHP kennt keine MySQL-Datentypen. Das Datum kommt entweder als String oder vielleicht als Unix-Timestamp, wenn du die entsprechende Funktion aufrufst. Als String muss es erst geparst werden, als Unix-Timestamp ist es eine Zahl und kann direkt an die Datumsfunktionen PHPs gegeben werden, die ja auf diesem Timestamp basierend rechnen.

                Mein Problem weiter unten wo ich es dann darum geht, wie lange ein Projekt läuft also die Anzeige für den User, ist damit noch nicht gelöst. Da müsste ich dann wieder auf meinen PHP Code zurückgreifen?

                Du möchtest eine Zeitdifferenz errechnen und darstellen. Das Problem dabei ist, dass eine Zeitdifferenz nicht mit einem DateTime darstellbar ist, sondern nur mit einem TimeSpan. Solch einen Typen kennt MySQL nicht. Es kann die Differenz nur als Time (innerhalb dessen Grenzen) oder als Integer-Wert (Anzahl der Sekunden) liefern. PHP hingegen kennt mit der DateInterval-Klasse einen solchen TimeSpan und DateTime::diff() kann ihn aus zwei Datümern erzeugen.

                dedlfix.

                1. Tach,

                  Du möchtest eine Zeitdifferenz errechnen und darstellen. Das Problem dabei ist, dass eine Zeitdifferenz nicht mit einem DateTime darstellbar ist, sondern nur mit einem TimeSpan. Solch einen Typen kennt MySQL nicht. Es kann die Differenz nur als Time (innerhalb dessen Grenzen) oder als Integer-Wert (Anzahl der Sekunden) liefern. PHP hingegen kennt mit der DateInterval-Klasse einen solchen TimeSpan und DateTime::diff() kann ihn aus zwei Datümern erzeugen.

                  danke für deine sehr ausführliche Erklärung, wenn ich das alles richtig verstanden habe, wäre es für mich zumindest am einfachsten den Wert direkt als Timestamp (Startdatum, sowie das Enddatum) in die Datenbank zu speichern. Damit kann PHP ohne Probleme arbeiten und ich bin flexibel?

                  1. Tach!

                    wenn ich das alles richtig verstanden habe, wäre es für mich zumindest am einfachsten den Wert direkt als Timestamp (Startdatum, sowie das Enddatum) in die Datenbank zu speichern. Damit kann PHP ohne Probleme arbeiten und ich bin flexibel?

                    Nein, nicht ganz. Im DBMS solltest du das schon als DateTime belassen, dann kannst du dort auch rechnen, was die Datums- und Zeitfunktionen hergeben. Wenn du in PHP (weiter)rechnen willst, dann lass dir den Wert als Unix-Timestamp ausgeben, den kann die MySQL-Funktion UNIX_TIMESTAMP() aus einem DateTime-Wert ermitteln. Damit bist du in beiden Welten handlungsfähig.

                    dedlfix.

                    1. Hallo,

                      ich wandel mein "deutsches" Datum so um:

                      
                      $date = '14.03.2015';
                      $datetime = strtotime($date);
                      $nedate = date('Y-m-d', $datetime);
                      $nextDay = strtotime("+3 day", strtotime($nedate));
                      $neu =  date("Y-m-d", $nextDay);
                      echo $neu;
                      
                      

                      Finde ich persönlich bisschen viel Code? Geht es etwas einfacher?

                      1. Tach!

                        
                        
                        > $date = '14.03.2015';
                        > $datetime = strtotime($date);
                        > $nedate = date('Y-m-d', $datetime);
                        > $nextDay = strtotime("+3 day", strtotime($nedate));
                        > $neu =  date("Y-m-d", $nextDay);
                        > echo $neu;
                        > 
                        
                        

                        Finde ich persönlich bisschen viel Code? Geht es etwas einfacher?

                        Die erste Umwandlung in Y-m-d inklusive anschließendem Parsen ist überflüssig. Und für den gezeigten Code ist auch $neu nicht erforderlich. Aber das wirst du vielleicht noch anderswo brauchen.

                        dedlfix.