Autor Zpráva
ForestCZE
Profil
Zdravím, mám následující kód:

public function getConfirmationTime(\DateTime $dt1, \DateTime $dt2): int
    {
        $dateTime1 = new \DateTime($dt1->format('Y-m-d H:i:s'));
        $dateTime2 = new \DateTime($dt2->format('Y-m-d H:i:s'));
        return $dateTime2->diff($dateTime1)->h;
    }

$now = new \DateTime("now");
bdump('Start: ' . $getTournament->start->format('Y-m-d H:i:s'));
bdump('Nyní: ' . $now->format('Y-m-d H:i:s'));
bdump('Rozdíl v hodinách: ' . $this->tournamentManager->getConfirmationTime($now, $getTournament->start));

Výstup: zde

Nevím, jestli jsem pouze přepracovaný, ale výstup by měl být 3 hodiny a ne 2. Je to tak? Co je špatně? Děkuji předem za pomoc.
Radek9
Profil
ForestCZE:
V $getTournament->start je co? A jaký byl aktuální čas, když jsi to spouštěl?
ForestCZE
Profil
Radek9:
Je to v tom výstupu :)

V $getTournament->start je 2020-07-25 17:00:00
Aktuální čas byl: 2020-07-25 14:56:38
Radek9
Profil
ForestCZE:
Pravda, toho jsem si nevšiml. Proč by to podle tebe měly být 3 hodiny? Jsou to 2 hodiny, 3 minuty a 12 sekund. Pokud to chceš v celých hodinách, tak si to musíš nějakým způsobem sám zaokrouhlit. Taky pozor, že v h nebude více než 23. Potom musíš zohledňovat dny, měsíce a roky. Nebylo by pro tvoje potřeby jednodušší odečíst prostě timestamp, vydělit 3600 a zaokrouhlit?
ForestCZE
Profil
Radek9:
Pravda, pravda. Všiml jsem si, že když jeden datum bude 2020-07-26 17:00:00 a druhý 2020-07-25 14:56:38, tak to pořád budou dvě hodiny a mělo by být 26. Takže, jak píšeš, asi timestamp. Ale nevím, jak na to. Pomohl bys mi, prosím? Děkuji :)
Radek9
Profil
ForestCZE:
Objekt DateTime má metodu getTimestamp. Zavolej ji na obou, výsledky odečti, vyděl 3600 a zaokrouhli pomocí ceil.
ForestCZE
Profil
Radek9:
public function getConfirmationTime(\DateTime $dt1, \DateTime $dt2): float
    {
        $dateTime1 = new \DateTime($dt1->format('Y-m-d H:i:s'));
        $dateTime2 = new \DateTime($dt2->format('Y-m-d H:i:s'));
        $getDateTime1 = $dateTime1->getTimestamp();
        $getDateTime2 = $dateTime2->getTimestamp();
        return ceil(($getDateTime2 - $getDateTime1) / 3600);
    }

Čas v DB: 2020-07-25 17:00:00
Aktuální čas: 2020-07-25 15:34:45

A výstup píše, že je to 26h, tak asi dobře :) Ještě jednou děkuji :)
RastyAmateur
Profil
ForestCZE:
S DateTime jsem nikdy nepracoval, takže možná úplně zcestná otázka, ale když ta tvá funkce bere v argumentech DateTime, proč je vytváříš znovu? To se tím zbavuješ dalších informací, nebo kde je ta výhoda?
ForestCZE
Profil
RastyAmateur:
Jsem si říkal, že mi to přijde nějaké divné :D Díky :)

Samozřejmě stačí:

public function getConfirmationTime(\DateTime $dt1, \DateTime $dt2): float
    {
        return ceil(($dt2->getTimestamp() - $dt1->getTimestamp()) / 3600);
    }
RastyAmateur
Profil
ForestCZE:
Když už jsme u toho code review, tak:
public function getConfirmationTime(\DateTime $dt1, \DateTime $dt2): int
A název metody také nesedí. Značí, že máš dostat nějaký time, zatímco dostáváš difference...
Radek9
Profil
RastyAmateur:
ceil vrací float, takže by to teoreticky mohlo řvát, teď si nejsem jistý. Ale dá se to samozřejmě přetypovat na int.
RastyAmateur
Profil
Radek9:
Aha, tak to jsem nevěděl. Má to nějaký důvod? Jakože se do toho strká float, tak aby to ten typ zachovalo?
ttttt
Profil *
RastyAmateur:
float mívá větší rozsah než int.
ForestCZE
Profil
RastyAmateur:
Jistě. Ta metoda musí mít návratový typ float, jinak to řve, že ho to očekává a dostává int. To už mám upravené, akorát už jsem to sem nepsal. A co se toho názvu metody týká, máš pravdu. Já všeobecně bojuju s názvy metod a popisky, co má metoda dělat, parametry a co má vracet :D Sám to vím, ale popsat to tak, aby to pochopil ten, kdo po mně třeba převezme projekt, to je vždy bída :D Jde vlastně o to, že mám turnaj a potřebuji, aby majitel týmu potvrdil minimálně dvě hodiny před turnajem, že se turnaje zúčastní. Takže vezmu čas, kdy začíná turnaj, zjistím, jaký je aktuální čas a ten rozdíl je výsledek, že třeba zbývá hodina do začátku turnaje. Pokud tě napadá nějaký lepší název metody, budu rád :)
RastyAmateur
Profil
ForestCZE:
Já osobně bych to hlavně neřešil přes nějaké hodiny, ale stále bych pracoval s tím DateTime objektem. Pomocí metod modify a nebo sub lze od začátku turnaje odečíst ty 2 hodiny a pak už to jen porovnáš s aktuálním časem. Další možnost je pomocí metody diff. Obojí mi přijde výrazně čitelnější a snáze udržovatelné.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0