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!
- 5182 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Hmm nem is rossz ötlet! Ki is próbálom! :)
(De így szerintem különbséget fogok kapni év/hónap/nap számban tehát az eredmény valami ilyen lesz: 0 év 0 hónap 2 nap)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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)));
}
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Erre volt a date_diff() függvény :-)
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
hogy ezt a google szot mindig el kell sutni... olyan prog.hu-s stilus, mar bocs
- A hozzászóláshoz be kell jelentkezni
Csak azért, mert amikor belefutottam a PHP vs MySQL dátum/idő változatokba, Google barátom segítségével néztem meg a példaprogramokat.
CSZ
- A hozzászóláshoz be kell jelentkezni
Mysql tud dátumot kivonni...
pch
- A hozzászóláshoz be kell jelentkezni
Ez meg olyan hupos volt :P
- A hozzászóláshoz be kell jelentkezni
Ez egyébként jogos; de az UTC-t mint elvet érdemes szem előtt tartani.
Az lenne a jó, ha lenne pl. UNIX64-idő, azaz 64 bites, azzal egy darabig ellennénk. (Mondjuk lehetne előjeles, ahol a negatív számok az 1970 előtti másodperceket jelentik értelemszerűen).
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Köszi teljesen érhető volt, most kaptam egy pár tippet, szépen végig próbálom az összes megoldást, aztán mérlegelek gányolás/idő megtakarítás alapján, mi lesz a megfelelő nekem!
Köszönöm az eddigi válaszokat! Most már menni fog! :)
- A hozzászóláshoz be kell jelentkezni
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++;
}
}
}
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
Hát, használhatnád a DateTime osztályt is. Lásd lentebb: http://hup.hu/node/61384#comment-642807
- waiter -
- A hozzászóláshoz be kell jelentkezni
Én raknék a ciklusba egy sleep(1)-et is, ha már lúd, legyen kövér!
- A hozzászóláshoz be kell jelentkezni
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 -
- A hozzászóláshoz be kell jelentkezni
5.2-ig voltak benne bugok, illetve 5.2-vel kerultek bele fejlesztesek (2 datetime objectet ossze lehet mar hasonlitani es mukodik is :))
Tyrael
- A hozzászóláshoz be kell jelentkezni
Na így írj valami tetszőleges tárhelyen működő portálrendszert.
- A hozzászóláshoz be kell jelentkezni
gophp5
Tyrael
- A hozzászóláshoz be kell jelentkezni
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. ;)
- A hozzászóláshoz be kell jelentkezni