Autor Zpráva
juneau
Profil
Problém jsem si sám vyřešil, chci jen poreferovat o vlastnosti, která se projeví málokdy a přitom způsobí fatální chybu. Samozřejmě také vím, že leden je 0, únor 1, březen 2 a pod.

Moje aplikace - spočítat počet dní mezi dvěma daty ve formátu RRRR-MM-DD. Jednoduše jsem si přes substring() vypreparoval rok, měsíc a den (šlo by to i jinak). Toto datum jsem zadal do Date(), získal unix timestamp přes getTime(), rodzíl mezi nimi jsem podělil počtem (mili)sekund na jeden den a měl jsem počet dní mezi dvěma daty. Kód:

var od = new Date();
od.setFullYear(od_rok);
od.setMonth(od_mesic-1);
od.setDate(od_den);
var od_time = od.getTime();
...



Vypadá to nevinně. Ale! Pokud jsem 30.9.2008 chtěl tuto aplikaci použít a první ze dvou dat bylo 28.2.2009 (na druhém - pozdějším - datu nezáleží), vyhodila mi aplikace jednak chybný, druhak záporný počet dní!

Proč? Pokud jsem získaný timestamp převedl zpět na datum, nešlo již o 28.2.2009, ale o 28.3.2009 -> místo února byl březen.

Vysvětlení je jednoduché - new Date() vytvořilo objekt data pro dnešní den -> což bylo 30.9.2008. Zadal jsem rok 2009 přes setFullYear() a datum bylo 30.9.2009. Zadal jsem stejně tak měsíc únor a ... ano, datum v objektu Date bylo nyní 30.2.2009. Což neexistuje a stal se s něj 30.3.2009. Doplnění dne na 28.3.2009 již nic moc nezměnilo.

Řešení? Stačilo zadávat datum v opačném pořadí - nejdříve den, pak měsíc a pak rok.

Píšu to sem jen proto, aby se někdo v budoucnu vyvaroval chyb, které se projeví jen poslední tři každého měsíce, pokud chce pracovat s datem 28.2. :)
Chamurappi
Profil
Reaguji na juneau:
Pěkný problém. Také jsem se jednou s datumovými funkcemi pral.

Zadal jsem stejně tak měsíc únor a ... ano, datum v objektu Date bylo nyní 30.2.2009. Což neexistuje a stal se s něj 30.3.2009.
Spíš se z něj stalo 2. března 2009. Podobně kdybys zadal „500. ledna 2009“, vyleze ti 15. května 2010. A také z „-602. ledna 2011“ se stane památné datum 8. května 2009. Občas se takové přetékání hodí.
los
Profil *
> Řešení? Stačilo zadávat datum v opačném pořadí - nejdříve den, pak měsíc a pak rok.
Správne riešenie je použiť v konštruktore parametre, napr.: var od = new Date(od_rok, od_mesic - 1, od_den)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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

0