mktime Tagesübergreifend

ich möchte in Zeitfenstern gewisse Dinge schalten (z.B. Licht)

das soll irgendwie so aussehen

$jetzt = time();
 
$beginn = mktime(20,0,0,0,0,0);
$ende = mktime(22,0,0,0,0,0);
 
if ($begin <= $jetzt && $jetzt <=$ende) {
 "Schalten";
}

bei $beginn 20:00 und $ende 22:00 ist alles gut

wie mache ich das aber, wenn $beginn 20:00 und $ende 05:00 sind? :confused::mad:

kann es gerade nicht ausprobieren aber eigentlich müsstest du das && einfach durch ein || ersetzen …

eigentlich nicht, weil

&& ist UND
|| ist ODER

Ja das ist ja der zweck:

negativ fall aktZeit: 6:00 Uhr - zeitplan 20:00 bis 5:00

dann entweder aktZeit größer als 20 oder 5:00 ist größer als aktZeit --> beides false passt
#####################
positiv fall aktZeit: 3:00 Uhr - zeitplan 20:00 bis 5:00

dann entweder aktZeit größer als 20 oder 5:00 ist größer als aktZeit --> erstes false , zweites true -> passt
##################
positiv fall aktZeit: 22:00 Uhr - zeitplan 20:00 bis 5:00

dann entweder aktZeit größer als 20 oder 5:00 ist größer als aktZeit --> erstes true, zweites false -> passt

und wenn ich wieder 20:00 bis 22:00 schalten will, passt es ja nicht mehr…

ich schau heute abend mal, wie es bei mir aussieht…

Hallo,

die Differenz zum Startwert zu addieren, wäre eine Möglichkeit.

$start=MKTIME(20,0,0,date("m"),date("d"),date("Y"));
$stop=$start+(9*60*60);
echo Date("d.m.Y H:i:s",$stop);

Gruß
Walter

Hi,

Nachtrag: Hab mir das gerade nochmal angesehen, wie ich das in meinen Skripten mache. Solange der Zeitraum zusammenhängend über die 00-Uhr-Grenze verläuft, kann man mit der ODER Verknüpfung arbeiten.
Wert ist dann >20 oder <6. Bei Zeiträumen vor 24.00 Uhr geht’s dann eben nur mit UND-Verknüpfung >20 && <23.
Aber wenn man das vorher weiß, ist das doch eigentlich kein Problem, oder sind die Von/Biswerte in Abhängigkeit von irgendwas flexibel?

Gruß
Walter

Hallo,

Falls nur die Angaben der Anfangs- und Endstunde für den Zeitraum gegeben sind,
sollte es so funktionieren:


$jetzt = time(); 

$stunde_beginn=22;  // Extremes Beispiel:
$stunde_ende=21;   // das Zeitfenster reicht mit diesen Zahlen von 22 Uhr bis 21 Uhr Folgetag 
  
$beginn = mktime($stunde_beginn,0,0,0,0,0); 
$ende = mktime($stunde_ende,0,0,0,0,0); 

$delta = $ende - $beginn;


/* Falls die Endstunde kleiner ist als die "Beginnstunde"
kann das nur bedeuten, dass das Zeitende am Folgetag liegt,
elso  einfach 24 Stunden dazu addieren: */  
if ($delta < 0) {
  $delta = $delta + 24*3600; 
}

$zeit_ende = $beginn + $delta;

/* Die Überprüfung , ob die aktuelle zeit im Zeitfenster liegt,
erfolgt dann an "Beginnstunde" und "Beginnstunde" + Zeitunterschied */

if ($beginn <= $jetzt AND  $jetzt <= $zeit_ende ) {
   // Was immer passiern soll, wenn das Script im Zeifenster aufgerufen wurde.
}

Gruß Rolf

ich habe es jetzt so gelöst


function Schaltzeit ($Beginn, $Ende)
	{
   $Beginn = mktime(substr ($Beginn,0,2), substr ($Beginn,3,5), 0, 0, 0, 0, -1);
   echo "Beginn $Beginn 
";
   $jetzt = mktime(date("H"), date("i"), 0, 0, 0, 0, -1);
   echo "jetzt  $jetzt 
";
   $Ende = mktime(substr ($Ende,0,2), substr ($Ende,3,5), 0, 0, 0, 0, -1);
   echo "Ende   $Ende 
";
	if ($Beginn < $Ende)
	   {
	   if ($Beginn <= $jetzt && $jetzt <= $Ende)
	      {
         echo "innerhalb der Zeit von z.B. 22:00 - 23:00 
";
         return true;
	      }
	      else
	      {
	      echo "ausserhalb der Zeit 
";
	      return false;
	      }
		}
	else
	   {
	   if ($Beginn <= $jetzt || $jetzt <= $Ende)
	      {
	      echo "innerhalb der Zeit von z.B. 22:00 - 02:00 
";
	      return true;
	      }
	      else
	      {
	      echo "ausserhalb der Zeit 
";
	      return false;
	      }
	   }
   }


if (Schaltzeit ("22:00", "01:00"))
	{
	echo "Jetzt schalten wir EIN";
	}
else
	{
	echo "Jetzt schalten wir AUS";
	}

super Sache das…

War gestern zu sopät zu Hause um noch reinzuschauen.

Aber meins ist sicher „unschöner“ - Werde dann auch auf deins umsteigen :wink:

Ich habe zu dem Code noch ganz viele Ideen, die ich in nächster Zeit umsetzen werde, so das man das Script dann durchaus als „Jahreszeitschaltuhr“ bezeichnen könnte.
Ich werde den Code entsprechend veröffentlichen.

geplant sind im Moment noch folgende Dinge:

  • Schaltzeiten in Abhängigkeit vom Wochentag
    z.B. - Montag von 10:00 - 12:00, Wochentags von 10:00 - 12:00
    - an Wochentagen von 10:00 - 12:00
    - am Wochenende von 10:00 - 12:00

  • Feiertage sollen da auch noch mit rein

Falls noch jemand Ideen und Anregungen hat, ich bin für allen „Quatsch“ offen, sofern es meine Programmierkenntnisse zulassen…

Hier meine kleine Weihnachtsbeleuchtung Funktion, die genau das macht.

Aktuell hat sie grad pause:


	function CheckTime($from, $to, $time = 0){
	   $time = ($time == 0)?time():$time;
	   
		if(!is_numeric($from)){
			$from_a = explode(":",$from);
			$from = mktime($from_a[0],$from_a[1]);
		}
		if(!is_numeric($to)){
			$to_a = explode(":",$to);
			$to = mktime($to_a[0],$to_a[1]);
		}
		$to = ($to < $from)?($to+86400):$to;
		return ($time >= $from && $time <= $to)?true:false;
	}

und Aufruf ist möglich mit:


	$current = mktime(23,15);
	
   echo CheckTime("22:00","02:30");
   // oder

   echo CheckTime("22:00","02:30",$current);
   // oder
	$from = mktime(22,15);
	$to   = mktime(01,20);
   echo checkTime($from,$to);
	// oder
	echo checkTime($from,$to,$current);

Gibt TRUE oder FALSE zurück;

Das ist ja mal eine kurze, knappe und effiziente Funktion. Super, danke !

Gruß
walter

Ja hier fehlt eindeutig mal der allseits bekannte „bedanken“ Button

@Paresy: Gibt es den für die vBulletin ???

Das lässt sich noch etwas weiter automatisieren ;).

Der erste Advent lässt sich ausrechnen und der 06.01. ist ja bekannt :). Und dann „ein wenn draußen dunkel“ und aus „nach Mitternacht“ oder „wenn danach noch Licht an ist, dann später“.

Du wirst es nicht glauben, aber so habe ich das gemacht.
allerdings nicht mit dem 1. Advent berechnen sondern der Einfachheit halber ab dem 1.12.

Ich poste meinen Teil heute Abend mal ;).

function getFirstAdvent($iYear){
	$iFirstAdvent = mktime(0, 0, 0, 11, 26, $iYear);
	while (0 != date('w', $iFirstAdvent))
		$iFirstAdvent += 86400;
return $iFirstAdvent;
}//getFirstAdvent()

Aufruf über

$FirstAdvent = getFirstAdvent(date('Y'));

Hallo Leute,

ich muss mich leider mal hier hinten ranhängen an den Thread. Ich habe in meiner ersten Version mit && (UND) zwischen den Uhrzeiten gearbeitet. Ergebnis war halt, dass um 22:00 Uhr brav auf „AUS“ gestellt wurde, aber um 0:00 Uhr wieder auf „EIN“.

Habe dann das && durch || (ODER) ersetzt. Auch das funktioniert nicht. Dann schaltet er sogar vor 22:00 Uhr auf „AUS“. Das verstehe ich nicht recht. In der Bedingung steht doch eindeutig das die aktuelle Zeit >= Beginn sein muss.

Irgendwie bin ich da an meiner Grenze des „nachvollziehbaren“ angelangt. Hab Ihr eine Idee?

<?
$Anwesend = GetValueBoolean(15336);
$jetzt = time();
$begin = mktime(22,0,0,0,0,0);
$ende = mktime(05,0,0,0,0,0);

if (($Anwesend == true) && ($begin <= $jetzt || $jetzt <=$ende)) //Wenn Cheffe im Haus ist UND die aktuelle Uhrzeit zwischen 22:00 und 05:00 Uhr ist, dann schalte AUS....sonst bla bla
	{
		SetValueBoolean(59859, false);
	}

	else

	{
		SetValueBoolean(59859, true);
	}


?>

Danke im Voraus…

vG Arne

EDIT:
Nicht das ich falsch verstanden werde. Ich erwarte jetzt keine Lösung, dazu gibt es genug Ideen und Ansätze hier in diesem Thread. Es geht mir einfach um das Verständnis, da ich nicht nachvollziehen kann warum die Bedingungen nicht funktionieren. Vielleicht ist meine Schreibweise im Script ja auch falsch oder fehlerhaft und ich sehe es einfach nicht.

so müsste es funktionieren:

$begin = mktime(22);
$ende = mktime(5);


Gruß Rolf