Datumsdifferenz in Tagen?

Hallo Ihr PHP-Cracks,

folgende Aufgabe:

Ein bestimmtes Datum liegt als Variable vor - wie kann ich in PHP mir dieses Datum minus drei Tage in eine (andere) Variable schreiben lassen?

Die unterschiedlichen Monatslängen etc. sollten natürlich berücksichtigt werden…ich habe mal irgendwo etwas von „strtotime“ gelesen, aber eine wirklich funktionierende PHP-Umsetzung für IPS nirgends ausmachen können.

Kann mir da jemand helfen?

Vielen Dank!

PHP: date - Manual

Hallo

das wäre ne Möglichkeit vom heutigen Tag 3 abzuziehen:

echo strtotime("-3 day"); 

Gruß

Danke, ich probiers mal aus!

nochmalwas zum ausprobieren:

<?
#Variablenzuweisungen
	$timestamp 	= 	time();
	$datum 		= 	date("d.m.Y",$timestamp);
	$uhrzeit 	= 	date("H:i",$timestamp);
	$messbeginn =  getvalue(16763 /*[EKM-868\s0 port 1 Heizung\messbeginn_öl]*/);      # aus string-variable auslesen
	$start  		= 	strtotime($messbeginn); # umwandlung in zeit
	$stop   		= 	strtotime($datum);   # umwandlung in zeit
	$delta      = 	round (($stop - $start)/60/60/24) ; # gesamtlaufzeit in tagen

echo "beginn:             $messbeginn 
";
echo "ende:               $datum 
";
echo "laufzeit in tagen:  $delta  
";

?>

Superklasse - vielen Dank!

Hallo,

mit

time()

lässt sich eigentlich gut rechnen, die frage ist wo kommt deine Variable mit Datum her und wie ist sie formatiert?
bei „20.11.2009“ müßte man sie erst zerlegen und dann zum Timestamp zusammensetzten.
Zusammensetzten würde so gehen:

mktime(0, 0, 0, 11, 20, 2009)

Hier noch ein kleines Beispiel:

<?
$time = mktime(0, 0, 0, 11, 20, 2009); // Datum in Timestamp Umwandeln.
echo $time." ";
$time2 = $time - 259200 ; // Datum - 259200 Sec. = 3 Tage.
echo $time2." ";
$datum = date("d.m.Y",$time2); // Timestamp in Datum umwandeln.
echo $datum." ";
?>

Änderung-------
Hab mir gerade den strtotime Befehl angesehen, damit kannst du das Datum in den Timestamp umwandeln.
Dann sieht es so aus:


<?
$datum = "20.11.2009";
$time = strtotime($datum);
$time2 = $time - 259200 ; // Datum - 259200 Sec. = 3 Tage.
$datum_neu = date("d.m.Y",$time2); // Timestamp in Datum umwandeln.
echo $datum_neu." ";
?>

Schöne Grüße
Thomas

Das Rechnen mit Sekunden sorgt z.B. bei Sommer-/Winterzeitumstellung für Probleme (siehe Hinweis unter PHP: date - Manual). Daher sollte man PHP: mktime - Manual verwenden.

Angepasst wäre das letzte Beispiel dann:

<?php
$datum = "20.11.2009";
$time = strtotime($datum);
$time2 = mktime(date("H", $time), date("i", $time), date("s", $time), date("n", $time), date("j", $time)-3, date("Y", $time)); // Datum -3 Tage
$datum_neu = date("d.m.Y", $time2); // Timestamp in Datum umwandeln.
echo $datum_neu." ";
?>

Hallo,

ich frage mich ob das so einfach geht?
Probiert hab ich es noch nicht.
Aber was währe z.B. am 02.12.2009, du nimmst ja den Timestamp splittest ihn auf und machs mit mktime einen neuen, wenn du jetzt 02 - 3 Tage rechnest würde zwar 29 bei raus kommen, aber beim monat würde sich doch nicht ändern?
Datum 02.12.2009


$time2 = mktime(date("H", $time), date("i", $time), date("s", $time), date("n", $time), date("j", $time)-3, date("Y", $time)); // Datum -3 Tage

Übersetzt würde es doch dann so aussehen:


$time2 = mktime(00, 00, 00, 12, 29, 2009); // Datum -3 Tage

Schöne Grüße
Thomas

<?php
$datum = "20.11.2009";
$time = strtotime($datum);
$time=strtotime("-3 day",$time); // <- -3 Tage ab $time;
$datum_neu = date("d.m.Y", $time2); // Timestamp in Datum umwandeln.
echo $datum_neu." ";
?> 

oder kurz:

<?

$datum = "20.11.2009";
$datum_neu=date("d.m.Y",strtotime("-3 day",strtotime($datum)));
?>

Negative Werte rechnet mktime korrekt um. Ist zwar nicht direkt in der Doku beschrieben, aber ein Beispiel dort hat -31 Tage drin. Die Variante von sysrun ist natürlich auch schön und kürzer.

Hallo,

ich bräuchte nochmal Hilfe :slight_smile:

Im Script unten werte ich im oberen Teil aus, ob heute jemand Geburtstag hat - das funktioniert auch superklasse!

Problem: ich möchte mir in eine separate Stringvariable schreiben, wer als nächstes Geburtstag hat - mitsamt der Differenz in Tagen. Ein Codeschnipsel habe ich im unteren Teil, dieser gibt z.B. die Differenz in Tagen zu einem Referenzdatum aus…aber wie kann ich das obere Array so auswerten, dass mir der nächste anstehende Geburtstag z.B. in der Form „Noch 4 Tage: Herbert“ ausgegeben wird?

Vielen Dank schonmal für Eure Hilfe!!!

<?php
    $geburtstage = array("1-5-2000" => "Franz",
                        "30-6-1984" => "Herbert",
                        "30-12-1987" => "Atze");
    $datum = getdate(time());
    foreach ($geburtstage as $geburtstag => $name)
        {
        $geburtstag = split("-", $geburtstag);
            if ($datum["mday"] == $geburtstag[0] and $datum["mon"] == $geburtstag[1])
                {
                echo "Heute hat ".$name." Geburtstag! <br />"."
";
                SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name");
                }
				else
					{
				   SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "--");
				   }
         }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   $datum1 = "20-11-2009";
	$datum2=date("d-m-Y",strtotime("-10 day",strtotime($datum1)));
	echo "$datum2"
?>

Hmm, keiner von den PHP-Freaks eine Idee? :o

Kann wirklich niemand helfen…? :confused:

Das Array mit den Geburtstagen liegt nach Datum sortiert vor (der erste Geburtstag im Januar steht also ganz oben und der letzte im Dezember an letzter Stelle des Arrays).

Man müsste wohl das Array mit dem Vergleich des aktuellen Tages durchlaufen lassen…oder vielleicht auch anders :slight_smile:

Ich stehe aufm Schlauch und das überfordert meine PHP-Kenntnisse leider um ein Vielfaches. Ich wäre wirklich sehr dankbar wenn mir da jemand eine Lösung präsentieren könnte - die Funktion ist doch sicher auch für andere interessant.

Vielen Dank vorab!


foreach($geburtstage as $datum => $name)
{
  $datum 		= explode("-", $datum);
  $heute 		= cal_to_jd(0,date("m"),date("d"),date("y"));
  $geburtstag    = cal_to_jd(0,$datum[1],$datum[0],date("y"));
  if($heute<$geburtstag)
  {
    $diff = $geburtstag-$heute;
    echo $name." hat in ".$diff." Tagen Geburtstag.";
    return;
  }
}

So sollte es funktionieren.

Hi dreamy1,
versuchs mal so:


  $geburtstage = array("1-5-2000" => "Franz",
                       "30-6-1984" => "Herbert",
  	                 "30-12-1987" => "Atze");
                       
  $now = mktime(0, 0, 0, date('n'), date('d'), date('Y'));

  foreach ($geburtstage as $geburtstag => $name) {
    $geburtstag = split("-", $geburtstag);

    $GebTag = mktime (0, 0, 0, $geburtstag[1], $geburtstag[0], date('Y'));
    if ($GebTag < $now) {
      $GebTag = mktime (0, 0, 0, $geburtstag[1], $geburtstag[0], date('Y')+1);
    }
    
    $Tage = round(($GebTag - $now) /60/60/24);
	 //echo $Tage."
";
    
    if ($Tage == '0') {
      echo "Heute hat ".$name." Geburtstag! <br />"."
";
      //SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "$name");
    } else {
      echo "In ".$Tage. " Tage hat ".$name." Geburtstag! <br />"."
";
      //SetValueString(41693 /*[Geburtstage\Geburtstag Heute]*/, "--");
    }
  }

@Ferengi-Master, Neon:

Vielen vielen Dank, dass Ihr Euch die Mühe für mich gemacht habt!!! Ihr habt mir wirklich sehr geholfen. :loveips:

Hallo neon,

top Gesamtlösung…:slight_smile:

wesseli

@ Neon

Bekomme folgende Ausgabe :
Deprecated: Function split() is deprecated in C:\IP-Symcon2\scripts\Geburtstage on line 9

Es gibt zwar die richtige Info aus, aber was bedeutet die obige Meldung ?

Gruss
B71

Hallo B71,
liegt wohl an Deiner PHP-Version (5.3.x).
PHP: Deprecated features in PHP 5.3.x - Manual

Ersetze mal „split“ durch „explode“ (s. Beispiel von Thomas), dann sollte es funktionieren.