logo
27.10.2020 08:47
1
Ahoj, mozek mi už neslouží tak prosím o pomoc nebo nasměrování.

mám inputy type date, jeden datum_od a druhy datum_do

v PHP potřebuji cyklus který mi vypíše datumy po dnech mezi datem od do data do
s ochranou pokud je dnů více než 30 a nebo pokud je datum do menší než datum od.

Příklad 1:
datum od : 2020-09-29
datum do : 2020-10-02

cyklus vypíše :
2020-09-29
2020-09-30
2020-09-01
2020-09-02

Příklad 1:
datum od : 2020-10-02
datum do : 2020-10-02

cyklus vypíše :
2020-09-29

sice jsem to naprogramoval pomocí
PHP kód:
$den=date("Y-m-d"strtotime("-$i days")); 
ale myslím si, že by to šlo možná lépe. Poradíte mi jak na to?

Co se právě děje na Webtrhu?

27.10.2020 08:52
2
Příklad 1 a 2 nedává smysl, ne? Resp. to co cyklus vypíše...
27.10.2020 09:37
3
udelals to spravne, vubec netusim proc bys to chtel delat jinak, kdyz mas tak dokonalou fci na datum jako je strtotime se kterou jde zvladnout vetsinu totalnich zaludnosti na jedinej radek...
27.10.2020 20:37
4
Původně odeslal Whispere
Příklad 1 a 2 nedává smysl, ne? Resp. to co cyklus vypíše...
ano, mělo to vypsat 2020-10-02, sorry
28.10.2020 08:49
5
Jdes spravnym smerem, ted to jen dat dohromady ... treba takhle


PHP kód:
$first '2020-07-29';
$last '2020-10-02';

$curr strtotime($first);
$last strtotime($last);

if( 
$curr $last ) {
  
$dates[] = date('Y-m-d'$curr);
}
else {  
  while( 
$curr <= $last ) {        
    
$dates[] = date('Y-m-d'$curr);
    
$curr strtotime('+1 day'$curr);
    if( 
count$dates ) == 30 ) break;         
  }
}

print_r($dates); 
28.10.2020 09:21
6
Nejsou tam ty podminky uplne zbytecne?

PHP kód:
$first '2020-07-29';
$last '2020-10-02';

$curr strtotime($first);
$last strtotime($last);

do {        
    
$dates[] = date('Y-m-d'$curr);
    
$curr strtotime('+1 day'$curr);
} while( 
$curr <= $last && count($dates) < 30);

print_r($dates); 
28.10.2020 21:43
7
PHP kód:
...&& count($dates) <= 30); 
28.10.2020 21:46
8
Původně odeslal crs
PHP kód:
...&& count($dates) <= 30); 
ne... schvalne jestli ti dojde proc ;)
28.10.2020 23:12
9
php od verze 5.3 na to má poměrně pěkné funkce DateTime a DatePeriod, kde je ošetřeno jako překrývající datum, tak i neplatné datumy, je pak možné vše ošetřit a správně informoval návštěvníka.

PHP kód:

$maxDays 
30;

try {
    
$startDate = new \DateTime('2020-09-29');
} catch(\
Exception $e) {
    
print_r("Neplatný datum od");
    return;
}
try {
    
$endDate = new \DateTime('2020-10-02');
} catch(\
Exception $e) {
    
print_r("Neplatný datum do");
    return;
}


$interval = \DateInterval::createFromDateString('1 day');
$period = new \DatePeriod($startDate$interval$endDate->modify("+1 day"));

if (
iterator_count($period) > $maxDays) {
    
print_r("Příliš dlouhý interval");
    return;
}

if (
iterator_count($period) === 0) {
    
print_r("Datumy se nepřekrývají");
    return;
}

foreach (
$period as $date) {
    
print_r($date->format("Ymd")."\n");

winexec: pokud je počáteční datum novější a konečné starší, vypíšeš počáteční, řekl bych, že bys neměl vypsat nic
Aleš: nemáš ošetřené, pokud počáteční datum je novější, stejně jako winexec

Když jsem tady viděl odpovědi, tak už jsem nechtěl reagovat a až teď si všímám, že jsou vlastně nevhodně.

Pro čitelnost mohu vynechat všechny kontroly vstupu, aby bylo lépe vidět samotné použití funkcí
PHP kód:
$startDate = new \DateTime('2020-09-29');
$endDate = new \DateTime('2020-10-02');
$maxDays 30;
$interval = \DateInterval::createFromDateString('1 day');
$period = new \DatePeriod($startDate$interval$endDate->modify("+1 day"));
foreach (
$period as $date) {
    
print_r($date->format("Ymd")."\n");

28.10.2020 23:23
10
Njn nechtel jsem venovat tolik casu něčemu co nekdo nekam.nalepi a bude rad ze to funguje.

Bod pro tebe, trochu se bojim ze to tady bude nedoceneno.
28.10.2020 23:29
11
já také ne, ale když jsem viděl chybný kód, nemohl jsem to tak nechal, profesní deformace. Kdyby to náhodou tazatel nevyužil, třeba to příjde užitečné někomu dalšímu. strtotime je strašně přeceňovaná funkce, pokusí se převést na datum i očividné nesmysly, vrací false, když se jí to opravdu nelíbí, vzniká pak zbytečně řada chyb (i bezpečnostních) v programech. Při penetračních testech to je jedno z hlavních míst, kde zkouším aplikaci dostat do kolen nebo do pro mě vhodného stavu.
28.10.2020 23:39
12
Strtotime nebo jeji obdoba v datetime je uplne genialni, jen se musi vic hlídat kdyz do toho ma jit uzivatelsky vstup :) nezatracoval bych to...

Ale tak ja uz u PHP nemam zadnou autoritu, uz par let sem v nem realne nic nedelal, max malou udrzbu starych kodu..
28.10.2020 23:45
13
Datetime vyhodí aspoň exception a program většinou zastaví, strtotime vyhodí false a pak se klidně nechá magicky přetypovat na int či porovnávat s čímkoliv. V PHP aktivně nedělám, jen občas nějaké code review či penetrace, přeci jen v php je napsané ledacos a z pohledu zabezpečení to je zrovna systém, který je v přední línii.