[PHP] Variablewert Datumsabhängig

kasimir

Member
Hallo,

wie stell ich es am besten an, das eine Variable (z.b. $a) in einem bestimmten Zeitraum (z.b. vom 5. September bis zum 20. Februar) den Wert z.b. "1" hat?

Danke
kasimir
 
Code:
if (time() < strtotime("6 Jan 2008") && time() > strototime("1 Dec 2007")) { 
   $a = "bla";
}
else {
   $a = "blupp";
}

Das Beispiel weißt der Variablen $a den Wert bla zu, wenn das aktuelle Datum <= 5. Januar und > 1. Dezember ist und sonst blupp.
 
Du hast in deiner Lösung ja aber feste Jahre drin, das heißt ja das die Variable nur einmal den Wert hat und nicht jedes Jahr in dem Zeitraum der Wert gesetzt wird. Oder seh ich das falsch?
 
Vll bisschen unschön, könnte aber gehen:
Bin mir nicht ganz sicher, ob es rein von der Syntax geht...

PHP:
$timestamp = time();
$year = date("Y",$timestamp);


if (time() < strtotime("6 Jan .$year.") && time() > strototime("1 Dec .$year.")) { 
   $a = "bla";
}
else {
   $a = "blupp";
}
 
Last edited by a moderator:
Dann mach doch die Jahresangabe in den Funktionen strototime variabel. Setz dafür eine variable ein, die immer das aktuelle Jahr enthält. Das aktuelle Jahr kannst du dir über andere Funktionen ausgeben lassen.

Ein bisschen Eigeninitiative ist manchmal ned schlecht.
 
jupp, nur probier das mal ohne die Punkte.
Wenn du es so meinst:
PHP:
$timestamp = time();
$year = date("Y",$timestamp);


if (time() < strtotime("6 Jan $year") && time() > strototime("1 Dec $year")) { 
   $a = "bla";
}
else {
   $a = "blupp";
}

dann bekomm ich auch immer nur blupp heraus.

Problem ist, das der 6.Jan 2007 > ist als time() und nicht <.
 
Im Beispiel ist das "Problem", dass ein Jahreswechsel in dem Intervall ist.
Ist dies bei deiner Anwendung überhaupt der Fall?

Ansonsten geht folgende Lösung, wobei dies wirklich ziemlich hässlich ist, weil man ausnutzt, dass php sich wenig um die Typen der Variablen kümmert. Eventuell gibt es elegantere Lösungen.

PHP:
$year = date("Y", time());
$n_year = $year+1;

if (time() < strtotime("6 Jan $n_year") && time() > strtotime("1 Dec $year")) {
   $a = "bla";
}
else {
   $a = "blupp";
}

echo $a;
 
PHP:
$jahr = date("Y", time());

$beginn = "20 Nov";
$ende = "12 Jan";

// aktuelle Zeit auf Tag "normalisieren"
$time = strtotime(date('d M Y', time()));

$inTime = false;

// Liegt time() nach Startdatum?
if ($time >= strtotime(sprintf('%s %d', $beginn, $jahr))) {
  // Liegt das Enddatum im selben Jahr nach dem Startdatum?
  if (strtotime(sprintf('%s %d', $ende, $jahr)) <= strtotime(sprintf('%s %d', $ende, $jahr))) {
    // Wenn nein, muss gegen das Datum im Folgejahr getestet werden
    $jahr++;
  }
  if ($time <= strtotime(sprintf('%s %d', $ende, $jahr))) {
    $inTime = true;
  }
}
else {
  // Wenn nicht, kann es sein, dass wir das Jahr gewechselt haben.
  // In dem Fall muss es vor dem Enddatum im aktuellen und nach
  // dem Anfangsdatum im vorangegangenen Jahr liegen
  if (
    ($time >= strtotime(sprintf('%s %d', $beginn, $jahr -1 ))) &&
    ($time <= strtotime(sprintf('%s %d', $ende, $jahr)))
  ) {
    $inTime = true;
  }
}

if ($inTime) {
  echo "Innerhalb der Daten.";
}
else {
  echo "Im Rest des Jahres.";
}
 
Last edited by a moderator:
PHP:
$year = date("Y", time()); 
$n_year = $year+1; 

if (time() < strtotime("6 Jan $n_year") && time() > strtotime("1 Dec $year")) { 
   $a = "bla"; 
} 
else { 
   $a = "blupp"; 
} 

echo $a;

Hier ist aber das Problem, wenn wir jetzt den 10. Jan 2008 haben dann ist ja $n_year = 2009. Also würd am 7.Jan 2008 $a = "bla" sein, obwohl es "blupp" sein sollte oder seh ich das gerade falsch?

@elias5000
Danke für deine Lösung. Ob sie wirklich geht kann ich nicht sagen, weil so fit bin ich in php noch nicht. Ich werd sie aber mal ausprobiern. Danke
 
Last edited by a moderator:
Nachdem ich noch einen kleinen Fehler aus meinem Code geworfen habe, sollte mein vorangegangenes Posting die Lösung sein.

PS: Das Problem ist hier weniger ein PHP-spezifisches, sondern ein algorithmisches. Der PHP-Code besteht aus simplen bedingten Verzweigungen.
 
Last edited by a moderator:
@elias5000
Sorry hab doch noch ein problem in deiner Variante gefunden. Hab mal die daten Probiert:
$beginn = "1 Dec";
$ende = "20 Dec";

Dabei kommt leider "Innerhalb der Daten." heraus. Obwohl wir den 27. Dec haben. :o
 
Stimmt. Ich hab das Enddatum dummerweise immer im Folgejahr vermutet.
Nochmal auf den geänderten Code schauen, bitte.

Nochmal edit: Jetzt liegen Start- und Enddatum innerhalb des Interval und es werden nur normalisierte Tageszeiten (0:00) verglichen.

Dann sollte es aber langsam funktionieren...
 
Last edited by a moderator:
Hier ist aber das Problem, wenn wir jetzt den 10. Jan 2008 haben dann ist ja $n_year = 2009. Also würd am 7.Jan 2008 $a = "bla" sein, obwohl es "blupp" sein sollte oder seh ich das gerade falsch?e


Wenn wir den 10.1.08 haben, dann ist year 2008 und n_year 2009. Also ist

time() < strtotime("6 Jan 2009") true
time() > strtotime("1 Dec 2008") false

also ist AND Verknüpfung false... ich seh da kein Problem.

Aber du hast teilweise Recht. Wenn wir den 2.1.07 haben, dann ist
time() < strtotime("6 Jan 2009") true und
time() > strtotime("1 Dec 2008") false

also mit AND Verknüpfungen false, obwohl es true sein sollte.


Umgehen kann man das mit ein paar Fallunterscheidungen vorher und dem setzen von $year und $n_year entsprechend der Fälle. Damit nähert sich die Lösung dann der Lösung von elias5000 an ;-)
 
Das ist meine persönliche Endfassung:
PHP:
$jahr = date("Y", time());

$beginn = "20 Nov";
$ende = "12 Jan";

// aktuelle Zeit auf Tag "normalisieren"
$time = strtotime(date('d M Y', time()));

$inTime = false;

// Liegt time() nach Startdatum?
if ($time >= strtotime(sprintf('%s %d', $beginn, $jahr))) {
  // Liegt das Enddatum im selben Jahr nach dem Startdatum?
  if (strtotime(sprintf('%s %d', $ende, $jahr)) <= strtotime(sprintf('%s %d', $ende, $jahr))) {
    // Wenn nein, muss gegen das Datum im Folgejahr getestet werden
    $jahr++;
  }
  if ($time <= strtotime(sprintf('%s %d', $ende, $jahr))) {
    $inTime = true;
  }
}
else {
  // Wenn nicht, kann es sein, dass wir das Jahr gewechselt haben.
  // In dem Fall muss es vor dem Enddatum im aktuellen und nach
  // dem Anfangsdatum im vorangegangenen Jahr liegen
  if (
    ($time >= strtotime(sprintf('%s %d', $beginn, $jahr -1 ))) &&
    ($time <= strtotime(sprintf('%s %d', $ende, $jahr)))
  ) {
    $inTime = true;
  }
}

if ($inTime) {
  echo "Innerhalb der Daten.";
}
else {
  echo "Im Rest des Jahres.";
}
 
Jaja. Da war noch ein grober Copy&Paste-Fehler drin und ein gedrehter Vergleich... *awww*

PHP:
$jahr = date("Y", time());

$beginn = "1 Dec";
$ende = "28 Dec";

// aktuelle Zeit auf Tag "normalisieren"
$time = strtotime(date('d M Y', time()));

$inTime = false;

// Liegt time() nach Startdatum?
if ($time >= strtotime(sprintf('%s %d', $beginn, $jahr))) {
  // Liegt das Enddatum im selben Jahr vor dem Startdatum?
  if (strtotime(sprintf('%s %d', $beginn, $jahr)) > strtotime(sprintf('%s %d', $ende, $jahr))) {
    // Wenn ja, muss gegen das Datum im Folgejahr getestet werden
    $jahr++;
  }
  if ($time <= strtotime(sprintf('%s %d', $ende, $jahr))) {
    $inTime = true;
  }
}
else {
  // Wenn nicht, kann es sein, dass wir das Jahr gewechselt haben.
  // In dem Fall muss es vor dem Enddatum im aktuellen und nach
  // dem Anfangsdatum im vorangegangenen Jahr liegen
  if (
    ($time >= strtotime(sprintf('%s %d', $beginn, $jahr -1 ))) &&
    ($time <= strtotime(sprintf('%s %d', $ende, $jahr)))
  ) {
    $inTime = true;
  }
}

if ($inTime) {
  echo "Innerhalb der Daten.";
}
else {
  echo "Im Rest des Jahres.";
}
 
Back
Top