Zjištění počtu dnů mezi dvěma datumy

Webster.K
Člen | 211
+
0
-

Zdravím všechny, řeším takovou zapeklitou věc a mé myšlenkové pochody na to nestačí a přijde mi, že vyrábím ohýbák na napínák. Z databáze získávám datum (jde o datum kdy auto půjde na STK, resp kdy mu končí). Toto datum vidím v šabloně a je správně. Hodilo by se mi vypsat třeba do závorky za to, kolik dní ještě zbývá, ale potřeboval bych nakopnout na správnou cestu. Dělat výpočet v Latte mi přijde jako nesmysl. Napadá mě udělat nějakou funkci Latte, kam to datum dám a ona vrátí počet dnů, ale abych se přiznal, vůbec netuším, jak něco takového provést. Nebo udělat filtr který hodnotu bude měnit? Něco ve stylu:

<p>STK: {$car->stk} {$cat->stk|mujFiltr}

představa by bylo, aby výpis vypadal takto:

STK: 2024-08-01 (20 dnů)

Do BasePresenteru jsem do funkce beforeRender přidal:

$this->template->addFilter('stk', function ($obsah) {
 nějaký obsah
}

Což mi funguje, ale nějak mi nedochází ten výpočet dní

Editoval Webster.K (5. 7. 18:50)

nightfish
Člen | 516
+
0
-

@WebsterK Funkce date_diff() (DateTimeInterface::diff()) ti vrátí DateInterval, který má property $days, obsahující počet dnů mezi dvěma datumy.

Editoval nightfish (5. 7. 18:59)

Webster.K
Člen | 211
+
0
-

Tak nevim jestli jsem to udělal vyloženě správně, ale výsledkem je tahle funkce:

$this->template->addFilter('stk', function ($obsah) {
      Debugger::barDump(date('Y-m-d',$this->aktualniDatum));
      Debugger::barDump($obsah->format('Y-m-d'));

      $origin = date_create(date('Y-m-d',$this->aktualniDatum));
      $target = date_create($obsah->format('Y-m-d'));
      $interval = date_diff($origin, $target);

      return "(" . $interval->format('%R%a days') . ")";
});

A vypadá, že to dělá to co potřebuju :) ještě to trochu upravím. Děkuji

Infanticide0
Člen | 103
+
+3
-

Takže řešením je vzít objekt DateTime, přeměnit ho na string a ten přeměnit zpátky na DateTime?

$interval = $this->aktualniDatum->diff($obsah).

  • Vůbec si nekaž život tim procedurálním PHP.
  • Název toho filtru je zbytečně specifickej, přitom dělá docela obecnou činnost, vrací “daysLeft”.
  • Název parametru filtru je $obsah, co to je? Proč ne $date a dat. typ.
  • $this->aktualniDatum je vždy “dnes”? Asi nepočítáš diffy u statisíců aut na stránce, a (new DateTime)->diff() bude víc odstíněný od Presenteru.