Autor Zpráva
D15
Profil *
Ahoj,

mám v input poli ve formuláři datum ve tvaru dd.mm.rrrr . Rád bych k němu na stisk buttonu připočetl 6 měsíců. Jak to v Javascriptu provést? Jde mi jen o ten kousek kódu v Javascriptu, který bude přičítat 6 měsíců.

Díky moc za radu.
D15
Profil *
Ještě pro jistotu zdůrazním, že to datum v tom input poli nemusí být dnešní - tj. obecný algoritmus bude fungovat asi ve smyslu načtení dat z formuláře, rozdělení jednotlivých hodnot na rok, měsíc, den, přičtení 6 měsíců a zase spojení do formátu dd.mm.rrrr .

Díky.
Joker
Profil
To je celkem lehké, není?
První co mě napadlo:

function pricti(vstup){
var datum_str = new String(vstup);
datum_arr = vstup.split(".");
datum = new Date(parseInt(datum_arr[2]),(parseInt(datum_arr[1]) - 1),parseInt(datum_arr[0]));
if(isNaN(datum)) return("");
datum.setMonth(datum.getMonth() + 6);
return(datum.getDate() + "." + (datum.getMonth()+1) + "." + datum.getFullYear());
}

Na celé přičtení stačí akorát jeden příkaz, a to:
datum.setMonth(datum.getMonth() + 6);

celý zbytek funkce jsou akorát kontroly toho řetězce, převod na datum a převod zpátky na řetězec.
(poznámka: funguje to i pro měsíce v druhé polovině roku, protože setMonth sama správně nastaví i rok, pokud je měsíc vyšší než 11)
D15
Profil *
Vyzkouším, díky. Já javascript moc neumím, proto je to pro mne neřešitelná otázka:-)
los
Profil *
Funkcia parseInt rozpoznáva reťazec "inteligentne", takže vie, že napríklad parseInt("0x0a") == parseInt("012") == 10. Pretože nula na začiatku znamená, že číslo je zapísané v osmičkovej sústave a zároveň parsovanie končí prvým nerozpoznaným znakom, tak napr. parseInt("09") == 0, čo v dátumoch vadí. Dá sa síce použiť druhý parameter funkcie parseInt, ktorý určí číselnú sústavu, ale v tomto prípade bude lepšie odčítať číslo a využiť tak automatickú konverziu.

function pricti(vstup) {

var arr = vstup.split(".");
var date = new Date(arr[2] - 0, (arr[1] - 1) + 6, arr[0] - 0);

return (isNaN(date)? "": date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear());
}
D15
Profil *
Perfektni, pouzil jsem funkci od LOS a funguje to. Chtel bych se zeptat jeste na jednu vec - jak udelat, aby vystup byl naformatovany ve stylu dd.mm.rrrr? Problem je, ze kdyz je treba 1.2. tak nevraci 01.02.2007, ale 1.2.2007.

Celou funkci jakz takz chapu, jen mi neni jasne, proc se v predposlednim radku pricita jednicka - v casti date.getMonth() + 1 ?

Diky moc.
Joker
Profil
los
Dobrá poznámka. Nasadit to dneska, tak to celý týden bude v pořádku fungovat, než by se na tu chybu přišlo :-)

D15
Obvyklý způsob je přidat tam ty nuly "ručně", něco takovéhoto:

(edit: ve skriptu bylo pár překlepů, o několik příspěvků níže je správně)
Joker
Profil
Jo, ještě toto:
Celou funkci jakz takz chapu, jen mi neni jasne, proc se v predposlednim radku pricita jednicka - v casti date.getMonth() + 1 ?
Protože objekt Date nepracuje s hodnotami měsíce 1-12, ale 0-11, tj. o 1 menší (tzn. že například červenec je 6, ne 7).
Ze stejného důvodu se na začátku při sestavování data jednička naopak odečítá:
var date = new Date(arr[2] - 0, (arr[1] - 1) + 6, arr[0] - 0);
D15
Profil *
Perfektni, diky moc!
D15
Profil *
Joker

Tak jsem zkousel tu funkci upravit podle tebe a nefunguje mi:-(

Je nasledujici:

function pricti6m(vstup) {
var arr = vstup.split(".");
var date = new Date(arr[2] - 0, (arr[1] - 1) + 6, arr[0] - 0);

if(isNan(date)) vystup = "";
else{
vystup = (date.getDate < 10) ? date.getDate+"." : "0"+date.getDate()+".";
vystup += (date.getMonth < 9) ? (date.getMonth()+1) + "." : "0" + (date.getMonth()+1) + ".";
vystup + date.getFullYear();
}
return vystup;
}
D15
Profil *
Nevis, kde muze byt chyba?
Joker
Profil
D15
njn, pár chybiček se vloudilo.
Tak ještě jednou a správně (opravy označeny tučně):

function pricti6m(vstup) {
var arr = vstup.split(".");
var date = new Date(arr[2] - 0, (arr[1] - 1) + 6, arr[0] - 0);

if(isNaN(date)) vystup = "";
else{
vystup = (date.getDate < 10) ? "0" + date.getDate+"." : date.getDate()+".";
vystup += (date.getMonth < 9) ? "0" + (date.getMonth()+1) + "." : (date.getMonth()+1) + ".";
vystup += date.getFullYear();
}
return vystup;
}

Za ty chybky se omlouvám, se stane, když sem člověk napíše skriptík "z voleje" :-)
D15
Profil *
Já se z toho picnu nefunguje - tedy funguje to ok, ale nepridava to nuly:-(
los
Profil *
Princíp je správny, len sú tam ešte nejaké preklepy - pri volaní funkcie chýbajú zátvorky. Po ich doplnení by to malo ísť.

Prípadne trochu čitateľnejšie:
function pricti6m(vstup) {

var arr = vstup.split(".");
var date = new Date(arr[2] - 0, (arr[1] - 1) + 6, arr[0] - 0);
var pad = function(x) { return (x < 10? "0": "") + x; };


return (isNaN(date)? "": pad(date.getDate()) + "." + pad(date.getMonth() + 1) + "." + date.getFullYear());
}
D15
Profil *
LOS:

Asi je tam jeste nejaka mala chybka, tvoje verze mi nefunguje vubec (vyhodi to chybovou hlasku byl ocekavan objekt ...).

Diky moc za Vasi trpelivost se mnou:-)
los
Profil *
Teraz som si to otestoval v IE, FF a O a žiadna chyba nenastala. Problém bude zrejme v niečom inom. Ak to máš vystavené niekde na webe, tak sa chyba nájde ľahšie.
D15
Profil *
Mam to zatim na lokale, zitra to zverejnim nekde na webu a napisu sem url. Diky moc za snahu pomoci.
Leo
Profil
"Jde mi jen o ten kousek kódu v Javascriptu, který bude přičítat 6 měsíců"

A co presne tim myslite. Pokud prictu 6 mesicu k 31. breznu 2007 mam dostat co? Podotykam, ze 31. zari neexistuje... Leo
D15
Profil *
LOS Máš pravdu, funguje to ok. Bylo to asi v cache a to jsem přitom mačkal CTRL+F5 - doteď jsem si myslel, že tahle dvojkombinace dokáže všechno znovunahrát. Děkuji ti moc za tvé rady, hodně jsi mi pomohl, díky!


Joker I tobě patří velký dík!
Joker
Profil
Pokud prictu 6 mesicu k 31. breznu 2007 mam dostat co?
Dobrá otázka; v zadání to není, takže předpokládám, že stačí, když se s tím skript "nějak" vyrovná a nezhavaruje :-)
Řešení prezentované zde by vrátilo 1. října. Ještě zajímavější jsou ale vstupy na konci srpna, kdy třeba 31.srpna dá výsledek 3. března nebo 2. března, podle toho, jestli ten následující rok je přestupný (např. 31.8.2006 -> 03.03.2007, 31.8.2007 -> 02.03.2008).
Leo
Profil
"Dobrá otázka; v zadání to není, takže předpokládám, že stačí, když se s tím skript "nějak" vyrovná a nezhavaruje :-)"

Asi to D15 bude stacit, ale otazka je, k cemu je takovy skript dobry :-) Treba je ale v necem interval 6 mesicu definovany prave takhle. Leo
D15
Profil *
Ještě jednou bych Vám chtěl poděkovat za tenhle funkční skript, který přičítá k datu ve formátu dd.mm.rrrr šest měsíců.

<pre>function pricti6m(vstup) {
var arr = vstup.split(".");
var date = new Date(arr[2] - 0, (arr[1] - 1) + 6, arr[0] - 0);
var pad = function(x) { return (x < 10? "0": "") + x; };


return (isNaN(date)? "": pad(date.getDate()) + "." + pad(date.getMonth() + 1) + "." + date.getFullYear());
}</pre>

Prosím, jak upravit tento skript tak, aby mi pracoval s datem ve formátu ddmmrrrr (čili úplně stejně jako předtím, jen jako oddělovač hodnot již nejsou tečky, ale nic. Čili teď je den substr($text, 0, 2), měsíc substr($text, 2, 2), rok substr($text, 4, 4) - takhle to mám v PHP. Ale jak to převést do Javascriptu?

Díky moc za radu.
D15
Profil *
Již vyřešeno. Jak jsem hned následovně zjistil, není to žádný horor, javascript má taky substr:-)
Toto téma je uzamčeno. Odpověď nelze zaslat.