[PHP] Posun datumu

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod McEver4 31. 1. 2011 11:28

Zdravím, může mi prosím někdo poradit, proč když napíši

Kód: Vybrat vše
$pristi_mesic=date("Y-m", mktime(0, 0, 0, date("m")+1, date("d"), date("Y")));


proč je třeba dnes 31.1. hodnota proměnné $pristi_mesic 2011-03 ? :hm
McEver4
Junior
Uživatelský avatar

Odeslat příspěvekod K8 31. 1. 2011 11:36

protože 31.2. neexistuje a php se to snaží "nějak" vyřešit a tak ty tři dni navíc přidá a vyjde mu 3.3. - stačí si upravit date("Y-m", na date("Y-m-d", a hned je to vidět (podle mě by ale asi bylo lepší, kdyby to zahlásilo chybu - neplatné datum - pak by to lidi nutilo rovnou psát správný algoritmus)

tento způsob práce s posunem datumu je totiž pěkná prasárna, existuje funkce strtotime, která je na to dělaná a navíc je potřeba si to dobře promyslet, co se děje, právě na konci měsíce, když následující měsíc pak daný den nemá
Naposledy upravil K8 dne 31. 1. 2011 12:04, celkově upraveno 2
K8
Pokročilý

Odeslat příspěvekod karlos00x 31. 1. 2011 11:45

co je cilem?
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod McEver4 31. 1. 2011 14:33

cílem je vypsat datum v určitém formátu například Y-m kde datum má být další a příští měsíc.

tak že takto ?
Kód: Vybrat vše
$pristi_mesic=strtotime("+1 month");
$pristi_mesic=date('Y-m', $pristi_mesic);
McEver4
Junior
Uživatelský avatar

Odeslat příspěvekod karlos00x 31. 1. 2011 14:47

a co ma byt vysledkem kdyz zadas 31.1.?
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod McEver4 31. 1. 2011 17:13

karlos00x: kdyz je 31.1.2011 tak mi to má vrátit 2011-02

-- 31. 1. 2011 16:17 --

K8 píše:protože 31.2. neexistuje a php se to snaží "nějak" vyřešit a tak ty tři dni navíc přidá a vyjde mu 3.3. - stačí si upravit date("Y-m", na date("Y-m-d", a hned je to vidět (podle mě by ale asi bylo lepší, kdyby to zahlásilo chybu - neplatné datum - pak by to lidi nutilo rovnou psát správný algoritmus)

tento způsob práce s posunem datumu je totiž pěkná prasárna, existuje funkce strtotime, která je na to dělaná a navíc je potřeba si to dobře promyslet, co se děje, právě na konci měsíce, když následující měsíc pak daný den nemá



Prasárna to je ale funkce strtotime dělá to samé :roll:
McEver4
Junior
Uživatelský avatar

Odeslat příspěvekod karlos00x 31. 1. 2011 17:52

Kód: Vybrat vše
$rok = date('Y', now());
$mesic = date('m', now());
if ($mesic == 12) {
  $mesic = 1;
  $rok = $rok + 1;
} else {
  $mesic = $mesic + 1;
}
$datum = ;// tady uz si to naformatuj skrz nulu v mesici


neni to na jeden radek, ale melo by to fungovat, ni?
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod K8 31. 1. 2011 21:55

ono totiž ten strtotime se musí použít správně - buď přičíst jeden den k poslednímu dni v měsíci (na to se např. dá použít funkce date) a tím dostaneme první den následujícího měsíce, nebo ten jeden měsíc se musí přičítat k prvnímu dni měsíce a pak to zase správně vrátí první den následujícího měsíce, takže je nesprávné v tomto případě používat aktuální den, neboť na konci měsíce to právě vrací "nesmysly" (když daný den už neexistuje v následujícím měsíci)

takže např.
Kód: Vybrat vše
$pristi_mesic=date("Y-m", mktime(0, 0, 0, date("m"), date("t")+1, date("Y")));
$pristi_mesic=date("Y-m", mktime(0, 0, 0, date("m")+1, 1, date("Y")));
$pristi_mesic=date("Y-m", strtotime("+1 mont", strtotime(date("Y-m-01"))));
$pristi_mesic=date("Y-m", strtotime("+1 day", strtotime(date("Y-m-t"))));

a vhodne je třeba na začátku skriptu si do nějaké proměnné uložit datum v timestampu prvního dne daného měsíce a pak s ním pracovat, aby se nemuselo opakovaně do sebe vnořovat tolik funkcí date a strtotime
Kód: Vybrat vše
$prvni_den=strtotime(date("Y-m-01"));
....
$pristi_mesic=date("Y-m", strtotime("+1 month", $prvni_den));
K8
Pokročilý

Odeslat příspěvekod McEver4 1. 2. 2011 10:27

tak že stačilo vlastně napsat :tleskani

Kód: Vybrat vše
$pristi_mesic=date("Y-m", mktime(0, 0, 0, date("m")+1, 1, date("Y")));
McEver4
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků