PHP dátum kezelése

Sziasztok!

Olyan problémám lenne, hogy van egy form -om. A form pedig tartalmaz két inputot, amibe dátumot kívánok beírni és azt feldolgozni. A probléma nem is itt lenne, mert a két input tartalmát átveszem és simán fel tudom dolgozni, de nekem a két dátum közötti dátumokra is szükségem lenne.

Tehát a kérdés! :)
Hogyan tudom a két dátum közötti napokat kiszámítani? Esetleg erre van valami sablonos megoldás?

Pl.: form_datum_1: 2008.01.01 form_datum_2: 2008.01.03
Eredmény: $form_datum_1,2008.01.02,$form_datum_2

Előre is köszönöm a segítséget!

Hozzászólások

szia en atalakitanam unix idove, ami egy int. igy kivonnam egymasbol a kettot. es a masodperceket meg visszaalakitanam napokka.
"mktime"

szerk: latom neked a napok kellenek de arra is jo a unix timestamppel valo jatszadozas, mert noveled a napi masodpercek szamaval es valamelyik fuggveny visszaadja a datum erteket.
ami a "date" :)

szép napokat
zsömi

Alakítsd unix timestampé mindkettőt, majd egy ciklusban adj hozzá 24*60*60 (egy nap)-ot, amíg el nem éred/át nem léped a másodikat.
Így minden iterációban ha visszaalakítod dátummá a timestampet, megkapod a köztes napokat sorban.

--
The Net is indeed vast and infinite...
http://gablog.eu

nekem 'éééé.hh.nn' formátumú dátumokkal kellett ezt megcsinálnom.
Kezdéshez elég lesz imho

$last_day = xxx;
$first_day = xxx;
$day = $last_day;

while($day >= $first_day){
$day = date('Y.m.d', mktime(0,0,0, substr($day, 5, 2), substr($day, 8, 2)-1, substr($day, 0, 4)));
}

Erre volt a date_diff() függvény :-)

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

A UNIX-idős megoldások a korrektek. A szöveges (ráadásul lokális időt tároló) változókkal való játszadozás nem javasolt, mert
- ahol file-ban vagy adatbázisban tárolsz egy időpontot, azt UTC-ben kellene
- ahol egy hardveres órát beállítasz, azt UTC-ben kellene
- ha hálózaton időpontot közölsz, azt UTC-ben kellene
- számításokat UTC-ben egyszerűbb - egységesen növő egész értékkel kell számolni, nem darabokkal, amelyek mindig máshogy járnak le (hónap vége, szökőévek, téli-nyári átállás (bár az csak az időpontot érinti), stb).
- ráadásul formátumfüggő (lokálfüggő)

Minden dátumkezelést UTC-ben korrekt (és érdemes) megoldani; csak kijelzéskor és bevitelkor kell helyi időt konvertálni. Kicsit is komolyabb projektnél csúnyán be lehet fürdeni, ha helyi időkkel tervezték meg / kezdték el csinálni a szoftvert.

Sajna SQL-ben ez nem annyira elterjedt dolog, legalábbis a PHP-MySQL páros úgy látom, nem motiválja az embert erre. Sőt, inkább az mktime függvényt készítették fel pl. a hónap 42. napjának kezelésére (amit átcsorgat a következő hónapra), meg ilyenekre; ez marha jópofa dolog, csak becsapjuk magunkat vele.

Azért a UNIX-idővel vigyázz, mert 1970.01.01-től 2038 valameddig van az értelmezési tartománya.
Tehát ha (pl) életkort is számolsz, akkor nem a legjobb választás.

egyébként Google.

CSZ

A Unix idő jobb helyeken előjeles, és 64 bites architektúrákon 64 bites. (Persze ez önmagában még kevés, például fájlrendszerek, esetleg egyes magasabb szintű API-k nem biztos hogy támogatják még.)

$ date -d '1970/01/01 00:00:00 UTC - 2345678901 seconds'
Sun Sep 1 23:31:39 CET 1895
$ date -d '1970/01/01 00:00:00 UTC + 2234998799 seconds'
Sun Oct 28 02:59:59 CEST 2040
$ date -d '1970/01/01 00:00:00 UTC + 2234998800 seconds'
Sun Oct 28 02:00:00 CET 2040
$ date -d '1970/01/01 00:00:00 UTC + 12345678901234567 seconds'
Thu May 22 15:56:07 CET 391220960

$ date -d '2400/02/29 12:00:00' +%s
13574602800


function get_julian_day($ye,$mo,$da) 
{
 $ye=(integer)$ye;$mo=(integer)$mo;
 if ( $mo<=2 )    {     $mo+=12;$ye-=1;         }
 $a=(integer)($ye/100);$b=2-$a+(integer)($a/4);
 $l=(integer)(1461*$ye/4)+(integer)(153*($mo+1)/5)+$b;
 $l+=$da+1720994.5;
 return($l);
}

julian datum, csillagaszatban hasznaljak, i.e. 4713 jan 1 UT de'l ota eltelt napok szama. A unix timestamp-bol (T) egyszeruen szamolhato: T=(JD-2440587.5)*86400, vagy forditva, JD=2440587.5+T/86400.

sajnos későn vettem észre a topicot, és most már alváshoz készülődöm... :)
Annyi, hogy én lehet kipróbálnám a strtotime() függvényt is azért...
Az mktime() -hoz az inputot valszeg fel kell darabolnod. Ezt ki lehet kerülni.
kezdes = strtotime(kezdő dátum)
befejez = strtotime(végső dátum)

utána egy for ciklus pl, ami hozzáad egy napot (24*60*60) a kezdő értékhez, és addig meg, míg a befejezőt el nem éri. És a cikluson belül date() függvénnyel kiíratod a köztes napokat. A date paraméterként elfogad timestamp -ot és nem kell mktime -mal vacakolni.

Minden esetre ez tényleg csak egy fáradt, lassan mondhatni hajnali tipp, de én így csinálnám. Bocsi ha felületes volt a válaszom, de remélem segítettem azért!

Az összes helyi időt használó függvénnyel, beleértve az mktime-ot is, nagyon vigyázz. Ha nem érted teljesen pontosan, hogy mit is csinálnak, könnyen írhatsz olyan kódot, ami óratologatás során hibásan viselkedik (esetleg csak bizonyos extrém időzónákban).

Ha az összes közbülső dátumra szükséged van, tehát nem úszod meg hogy egyesével lépkedj, akkor lehet hogy az a legegyszerűbb és leghordozhatóbb, ha saját magad lekódolod a következő napra ugrást.

Abszolút spontán, valami nemlétező programnyelven:


// honap 0-tol 11-ig
napok_szama(ev, honap) {
if (honap == 1 && ev % 4 == 0 && (ev % 100 != 0 || ev % 400 == 0)) return 29;
return {31, 28, 31, 30, ... 31}[honap];
}

osszes_kozbulso_nap() {
while (még nem értük el a célt) {
nap++;
if (nap == napok_szama(ev, honap) + 1) {
nap = 1;
honap++
}
if (honap == 12) {
honap = 0;
ev++;
}
}
}

Vélemény? Szóval így sikerült megoldanom és működik :)

//Deifináljuk a két változót
$kezdet = "2008-01-01";
$veg = "2008-01-10";

//Áttalakítjuk Timestampba
$kezdet_date = strtotime($kezdet);
$veg_date = strtotime($veg);

//Kivonás, a nagyobból a kisebbet
$eredmeny = $veg_date-$kezdet_date;

$napok = floor($eredmeny/60/60/24) + 1;

for ($i = 0; $i < $napok; $i++)
{
$koztesnapok = date("Y-m-d", mktime(12,0,0,date("m", strtotime($kezdet)),
(date("d", strtotime($kezdet)) + $i), date("Y", strtotime($kezdet))));
echo $koztesnapok .",";
}

A PHP eddigi idő és dátumkezelése egy nagy rakás szutyok... volt. Ám az újabb verziókban (>= 5.1.0) előálltak egy DateTime nevű osztállyal, ami az eddigi (és a fentebb említett) problémákat (is) hivatott kiküszöbölni és az egész idő/dátum kezelést egy kissé megkönnyíteni.

Részleteket lásd itt: http://hu2.php.net/datetime

Főleg a lap alján található "JonathanCross.com" hozzászólását emelném ki. Egyébként jómagam is ezt használom PHP 5.2-vel és jól működik. Igaz, még kissé szegényesen dokumentált, de a neten van azért róla info.

- waiter -

Tessék:

function nap_kulonbseg($start_datum, $vege_datum)
{

$start_array = date_parse($start_datum);
$vege_array = date_parse($vege_datum);

$greg_start_datum = gregoriantojd($start_array["month"], $start_array["day"], $start_array["year"]);
$greg_vege_datum = gregoriantojd($vege_array["month"], $vege_array["day"], $vege_array["year"]);

return round(($greg_vege_datum - $greg_start_datum), 0);
}
--
Coding for fun. ;)