Autor Zpráva
lesiak307
Profil
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
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 *
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
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
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
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
:))) ja viem, asi veľmi to PHP neovládam, no venujem sa tomu tak pol roka :)))
petr 6
Profil
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
Ahaaa :))) dobre už to ide :) ) takže to "now" berie aktuálny dátum a čas alebo iba čas??? alebo čo
petr 6
Profil
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
a s "TODAY" vrátilo 1...
AM_
Profil
[#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
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
já používám
"SELECT DATEDIFF(NOW(), date) AS dny..."
- vrací to rozdíl ve dnech...
jinak to se musí naházet do pole, co já vím...
while ($row= mysql_fetch_array($komunalny2) {
$datum = row[0];
}
lesiak307
Profil
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
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
[#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
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
[#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
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 :)

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