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 |
#3 · Zasláno: 25. 7. 2020, 15:05:55
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 |
#4 · Zasláno: 25. 7. 2020, 15:16:41
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 |
#6 · Zasláno: 25. 7. 2020, 15:25:27
ForestCZE:
Objekt DateTime má metodu getTimestamp . Zavolej ji na obou, výsledky odečti, vyděl 3600 a zaokrouhli pomocí ceil .
|
||
ForestCZE Profil |
#7 · Zasláno: 25. 7. 2020, 15:35:51
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 |
#8 · Zasláno: 25. 7. 2020, 15:45:23
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 |
#9 · Zasláno: 25. 7. 2020, 17:18:32
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 |
||
Radek9 Profil |
#11 · Zasláno: 25. 7. 2020, 18:46:34
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 |
#12 · Zasláno: 25. 7. 2020, 18:47:40
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 * |
#13 · Zasláno: 25. 7. 2020, 19:03:02
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 |
#15 · Zasláno: 26. 7. 2020, 13:08:25
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é.
|
||
Časová prodleva: 4 roky
|
0