Autor | Zpráva | ||
---|---|---|---|
lesiak307 Profil |
#1 · Zasláno: 29. 1. 2010, 11:00:31
Dobrý deň. Chcel by som sa spýtať, či je nejaká funkcia, alebo nejaký spôsob ako odpočítať dva dátumy a nakoniec vypísať rozdiel v počte dní. Napr. 2.2.2010 odpočítať o dnešného dátumu 29.1.2010 a výsledok vypísať v dňoch. Včera som celý deň presedel nad dátumovými a časovými funkciami ale na rozumný spôsob som neprišiel, len samé krkolomné riešenia. Ďakujem
|
||
AM_ Profil |
#2 · Zasláno: 29. 1. 2010, 11:21:47
můžeš použít
$diff = strtotime('2.2.2010') - strtotime('29.1.2010'); $diff_days = round($diff / 86400); //zaokrouhleni je dulezite, skryje to hodinovou odchylku u zmeny letni/zimni cas Obecně platí, že pro výpočty data/času je dobré používat vestavěné funkce jako strtotime, protože počítají se všemi odchylkami (přestupné roky, změny letní/zimní čas...), než si na to psát vlastní funkce a dávat dohromady pravidla pro výpočet znovu sám. Bohužel na rozdíl mezi dvěma daty nevím jestli vestavěná funkce existuje (já ji neznám), ale se strtotime() se to dá poměrně vymyslet bez příliš vlastní režie. |
||
Carrot Profil * |
#3 · Zasláno: 29. 1. 2010, 11:55:34
AM:
„Bohužel na rozdíl mezi dvěma daty nevím jestli vestavěná funkce existuje (já ji neznám)“ Je na to operátor "-" Ale samozřejmě není možné odečítat hrušky od jablek, takže se čas převádí na unixový timestamp, který je lineární - například zmiňovanou fcí strtotime. |
||
lesiak307 Profil |
To je super. Skúšal som to a funguje! No dalo by sa nejak ten dátum vložiť pomocou nejakej konštanty alebo premennej? Skúšal som to ale vypočítalo to nejakú blbosť...
$komunalny = strtotime("1.2.2010"); $dnes = strtotime("now"); if ($dnes == $komunalny) { echo "Zber komunalneho odpanu je: <b>dnes</b>"; } else { $diff = strtotime('komunalny') - strtotime('now'); $diff_days = round($diff / 86400); //zaokrouhleni je dulezite, skryje to hodinovou odchylku u zmeny letni/zimni cas echo "Zber komunalneho odpadu je o ".$diff_days." dni"; } Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
|
||
petr 6 Profil |
#5 · Zasláno: 29. 1. 2010, 12:09:54 · Upravil/a: petr 6
lesiak307:
„Skúšal som to a funguje! No dalo by sa nejak ten dátum vložiť pomocou nejakej konštanty alebo premennej? Skúšal som to ale vypočítalo to nejakú blbosť...“ Tvuj popis problemu je přinejmenším zvláštní, nicméně pokud se nám snažíš říct, že ten skript nedělá to, co bys chtěl, aby dělal (soudím podle textů o svozu odpadu), tak to bude nejspíš tím, že tak, jak je napsaný, nemůže dělat to, co chceš (a tudíž funguje správně). Zkus si vypsat echo strtotime("now"); echo strtotime("today"); echo strtotime("29.1.2010"); |
||
lesiak307 Profil |
Pardon mal som tam chyby...
$komunalny2 = "30.1.2010"; $komunalny = strtotime($komunalny2); $dnes = strtotime("now"); if ($dnes == $komunalny) { echo "Zber komunalneho odpanu je: <b>dnes</b>"; } else { $diff = $komunalny - $dnes; $diff_days = round($diff / 86400); //zaokrouhleni je dulezite, skryje to hodinovou odchylku u zmeny letni/zimni cas echo "Zber komunalneho odpadu je o ".$diff_days." dni"; } ale aj tak keď som to "opravil" tak to nefunguje správne. Podmienka nejde dobre. Ak sa zadaný dátum zhoduje s aktuálnym, ignoruje to a ide na else. A taktiež ak je zadaný dátum 30.1.2010 a dnes je 29.1.2010 zobrazí rozdiel 0 dní. myslím že by malo vrátiť 1 deň.. ? |
||
lesiak307 Profil |
#7 · Zasláno: 29. 1. 2010, 12:15:07
Aby som bol konkrétnejší, chcel by som spraviť nejakú databázu dátumov. V databáze alebo v nejakej konštante by boli zadané dátumy s ktorými by sa porovnával aktuálny dátum. Avšak ak by už prešiel jeden zadaný dátum, odpočítavalo by to z ďalšieho nasledujúceho. Asi je to zložité, ale ináč to neviem vysvetliť.
|
||
petr 6 Profil |
#8 · Zasláno: 29. 1. 2010, 12:16:19
lesiak307:
„Ak sa zadaný dátum zhoduje s aktuálnym“ To není to, co ověřuješ tou podmínkou. Tvůj skript, narozdíl od tebe, nic neignoruje ;-) |
||
lesiak307 Profil |
#9 · Zasláno: 29. 1. 2010, 12:18:26
:))) ja viem, asi veľmi to PHP neovládam, no venujem sa tomu tak pol roka :)))
|
||
petr 6 Profil |
#10 · Zasláno: 29. 1. 2010, 12:22:56
lesiak307:
„:))) ja viem, asi veľmi to PHP neovládam, no venujem sa tomu tak pol roka :)))“ Rozdíl mezi slovy "now" a "today" snad zvládneš ;-) |
||
lesiak307 Profil |
#11 · Zasláno: 29. 1. 2010, 12:27:13
Ahaaa :))) dobre už to ide :) ) takže to "now" berie aktuálny dátum a čas alebo iba čas??? alebo čo
|
||
petr 6 Profil |
#12 · Zasláno: 29. 1. 2010, 12:30:45
lesiak307:
Ty sis to nezkusil vypsat, že ne? To je pak těžký radit někomu, kdo nepřijímá rady :-( |
||
lesiak307 Profil |
$komunalny2 = "30.1.2010"; $komunalny = strtotime($komunalny2); $dnes = strtotime("now"); if ($dnes == $komunalny) { echo "Zber komunalneho odpanu je: <b>dnes</b>"; } else { $diff = $komunalny - $dnes; $diff_days = round($diff / 86400); //zaokrouhleni je dulezite, skryje to hodinovou odchylku u zmeny letni/zimni cas echo "Zber komunalneho odpadu je o ".$diff_days." dni"; } Vrátilo 0 |
||
lesiak307 Profil |
#14 · Zasláno: 29. 1. 2010, 12:51:00
a s "TODAY" vrátilo 1...
|
||
AM_ Profil |
#15 · Zasláno: 29. 1. 2010, 13:03:17
[#13] lesiak307
Strtotime pracuje s kompletním údajem o čase, tj datum i čas. Takže celkem intuitivně, "now" je tato vteřina, "today" je dnes 0:00. „Vrátilo 0“ „a s "TODAY" vrátilo 1...“ a co bys čekal? rozdíl mezi "teď" a "zítra 0:00" je nějakých 11 hodin, takže je to nejblíže 0 dní. TODAY je samozřejmě správně, rozdíl mezi dnešní a zítřejší půlnocí odpovídá jednomu dni, ano, sběr odpadu je zítra. Nevím, jestli jsi poslední 2 posty mínil jako problém, tak nějak nevím, co víc jsi tedy tím mínusem myslel. [#7] Najít nejbližší vyšší datum samozřejmě lze, např. takto: SELECT datum FROM sberodpadu WHERE datum > CURDATE() ORDER BY datum ASC LIMIT 1 [#3] Carrot > Je na to operátor "-" > Ale samozřejmě není možné odečítat hrušky od jablek To je asi jako říct "mám zařízení, které cestuje rychleji než světlo, ale bohužel to není fyzikálně možné, takže musí cestovat pomaleji". Když něco nejde, tak na to zřejmě operátor mínus nepomůže :D O rozdílu timestampů (nikoli datumů) s výsledkem ve vteřinách (nikoli např. přesný odstup dnů, což je často potřeba) jsem se zmínil, tak nějak nevidím, jakou jsi svým příspěvkem přinesl novou informaci. |
||
petr 6 Profil |
#16 · Zasláno: 29. 1. 2010, 13:07:38
Ehm, tak ještě jednou:
Ty sis tohle nezkusil vypsat, že ne? echo strtotime("now"); echo "<br>"; echo strtotime("today"); echo "<br>"; echo strtotime("29.1.2010"); Tento kód si vlož do nějakého php souboru, a podívej se, co vypíše. Pak zmáčni F5, a podívej se znovu, co vypíše. Já jsem udělal to samé před tím, než jsem sem tuto radu napsal, abych se opravdu ujistil, co vrací strtotime("now") Pro neangličtináře bych ještě podotknul, že now znamená nyní a today znamená dnes. |
||
lesiak307 Profil |
[#15] AM
takže skusil som ako si poradil... $komunalny2 = mysql_query("SELECT datum FROM komunalny WHERE datum > CURDATE() ORDER BY datum ASC LIMIT 1"); echo $komunalny2; no vrátilo: Resource id #3 Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
|
||
SkyVessel Profil |
#18 · Zasláno: 30. 1. 2010, 12:36:09
já používám
"SELECT DATEDIFF(NOW(), date) AS dny..." jinak to se musí naházet do pole, co já vím... while ($row= mysql_fetch_array($komunalny2) { $datum = row[0]; } |
||
lesiak307 Profil |
#19 · Zasláno: 30. 1. 2010, 13:25:59
Myslím, že som vytvoril zlú tabuľku v MySQL, pole typu DATE, ale tam to ukladá vo formáte YYmmdd, alebo to nevadí?
|
||
AM_ Profil |
#20 · Zasláno: 30. 1. 2010, 13:29:23
lesiak307:
„no vrátilo: Resource id #3“ Výsledek MySQL dotazu je skutečně resource, takže k přečtení údajů slouží: mysql_fetch_assoc mysql_fetch_array mysql_fetch_row mysql_result |
||
lesiak307 Profil |
#21 · Zasláno: 30. 1. 2010, 13:49:39
[#20] AM
$komunalny2 = mysql_fetch_array("SELECT datum FROM komunalny WHERE datum > CURDATE() ORDER BY datum ASC LIMIT 1"); echo $komunalny2; kurnik, nič nevzbralo :(( |
||
AM_ Profil |
#22 · Zasláno: 30. 1. 2010, 14:28:01
lesiak307:
$komunalny2 = mysql_query("SELECT datum FROM komunalny WHERE datum > CURDATE() ORDER BY datum ASC LIMIT 1"); list($komunalny2) = mysql_fetch_row($komunalny2); příště prosím použij dokumentaci, když budeš slepě opisovat nějaké příkazy a nemít nejmenší tušení, jak fungují, nemůže to dopadnout dobře. |
||
lesiak307 Profil |
#23 · Zasláno: 30. 1. 2010, 14:59:45
[#22] AM
No hej, len keby som vedel kde tu dokumentáciu (nie v angličtine) hľadať. Ináč, VEĽMI pekne ďakujem za pomoc. Keby sa dalo, pozvem ťa na pivo :))) |
||
AM_ Profil |
#24 · Zasláno: 30. 1. 2010, 15:37:51
to bych si nechal líbit:)
- na základní věci se dá obvykle najít spousta tutoriálů v češtině třeba na http://root.cz, např. http://www.root.cz/vyhledavani/?qs=mysql+php&search=Hledat - na php.net se dá obvykle v dokumentaci z příkladů kódu vykoukat víc než ze samotného textu, nehledě na to jestli umíš anglicky nebo ne :) |
||
Časová prodleva: 14 let
|
0