Sziasztok,
Adott egy naptáram, amiben PHP-vel generálom a kezdő időpontokat.
Az időpontok éjféltől éjfélig mennek, és 2 órás lépésekben számol a rendszer.
Tehát:
00:00
02:00
04:00
06:00
stb.
A gondom az, hogy most lesz az óraátállítás március 27-én, és ott így generálódnak most az értékek:
00:00
03:00
05:00
stb
Én szeretném továbbra is a 2 órás lépcsőket megtartani.
Van erre valamilyen lehetőség szerintetek?
Jelenleg egyszerűen így generálom az időpontokat (a példa kedvéért)
<?php
$start = strtotime("2022-03-27 00:00");
$end = strtotime("2022-03-28 00:00");
$step = 2 * 60 * 60;
$range = range($start, $end, $step);
foreach($range as $hour) {
echo date("H:i", $hour)."<br/>";
}
?>
Nagyon örülnék egy gyors megoldásnak. :)
- 174 megtekintés
Hozzászólások
Ha fixen párosak az órák, akkor nem kell a time-ből származtatni. Hiszen minden nap 00:00-23:59-ig szalad.
Ötlet: válaszd szét a dátum kezelését (date) és az órákat. Utóbbiak 00:00-tól 2-esével lépnek.
<?php
$start = strtotime("2022-03-27 12:00");
$napok = 3;
for ($nap = 0; $nap < $napok; $nap++) {
$datum = date("Y.m.d.", $start + 86400*$nap);
for ($hour = 0; $hour < 24; $hour +=2) {
printf("%s %02d:00<br>\n", $datum, $hour);
}
}
?>
... most látom, strftime php-ban deprecated lett. Átírtam date()-ra.
- A hozzászóláshoz be kell jelentkezni
Aha, na most jó ötletet adtál, meglátom hogy tudom átdolgozni.
A probléma, hogy a "lépcső" állítható, 30 perc, 1 óra, 2 óránál. Viszont az ötlet jó! Köszi!
- A hozzászóláshoz be kell jelentkezni
Köszi a tippet, végül tegnap sikerült úgy megoldani, ahogy szerettem volna.
E szerint amikor időátállítás van, akkor is marad a 2 órás lépés és a végén az adott nap unix timestamp értékeit kapom meg.
00:00
03:00
04:00
06:00
stb
Megosztom itt is, hátha másnak is hasznos lesz még.
class GenerateSlots {
/**
* Generate time slots, need to escape summer/winter time shift
*/
static function generate($date, $start, $end, $step) {
$min_hour = date("G", $start);
$max_hour = date("G", $end);
if($max_hour == 0) $max_hour = 24 - ($step / 60 / 60);
$step_hour = ($step / 60 / 60);
$times = [];
for ($hour = $min_hour; $hour <= $max_hour; $hour += $step_hour) {
if(self::isInt($hour)) {
$current = $hour.":00";
} else {
$current = floor($hour).":30";
}
$current_unix = strtotime($date." ".$current);
$times[$current_unix] = $current_unix;
}
return $times;
}
static function isInt($int){
return preg_match('@^[-]?[0-9]+$@',$int) === 1;
}
}
- A hozzászóláshoz be kell jelentkezni
Nagyjából és is a for ciklust javasoltam a proghun.
- A hozzászóláshoz be kell jelentkezni