Hibás dátum érték

Hibás dátum érték
2021-03-25T10:37:51+01:00
2021-03-26T21:22:49+01:00
2022-10-15T21:26:14+02:00
Öregurasan
Segítséget kérnék, hol hibázok.
MYSQL ben tárolt dátumot szeretném összehasonlítani az aktuális dátummal. Szükségem lenne  a dátumok közötti  napok számára. 
Sajnos hibás eredményeket kapok. pld ma 25. -e van

a táblázatban tárolt  2021-03-23 16:23:14 re helyes +2 kapok,
                                 2021-03-24 16:23.14 re helyes +1 kapok
                                 2021-03-25 16:23:14 re helyes +0 kapok
                                 2021-03-26 16:23:14 re ????,    -0 kapok!!!!!!!!!!
                                 2021-03-27 16:23:14 re ?????   -1 kapok stb stb

A MYSQL ben a "p_datum"-ot current_timestamp/default_generated tárolom.

lekérdezés
 select.....
$datum=$sor['p_datum'];

* lásd lentebb

$datum1=date_created();                 //aktuális dátum
$datum2=date_created($datum);    //a lekérdezett dátum
$diff=date_diff(datum1,datum2);
$elteres=$diff->format("%R%a);

* Próbálkoztam a dátum előzetes formázásával, de az sem vezetett eredményre. 

$datum3=date_create($datum);
echo '<br>1.Eredmény = '.date_format($datum3,"Y-m-d");
$datum=date_format($datum3,"Y-m-d") ;

Ha a $datum1=date_create(); ba ....create("2021-03-25") beírom hibátlanul eredményeket kapok.

Előre is köszönöm
Mutasd a teljes hozzászólást!
A tavaszi/őszi óraállítást hogyan akarod figyelembe venni?

Ha sehogy, akkor a localtime-ban vett dátum+időt úgy konvertáld unix-timestamp-pé, mintha UTC lenne, azután a két unix-timestamp különbségét oszd el 24*3600-zal.

Ha figyelembe akarod venni, akkor a localtime-ban vett dátum+időt úgy konvertáld unix-timestamp-pé, mintha localtime lenne, azután a két unix-timestamp különbségét oszd el 24*3600-zal. (Ilyenkor okozhat gondoz, hogy van 23 órás és 25 órás nap is az évben).
Mutasd a teljes hozzászólást!

  • Köszi írtó gyors vagy. Igazából az idő nem szükséges, csak a napok . nem zavar be az óra átállítás.
    A használat reggel 6 és este 9 között van, így az átállítás elvileg nem szól bele. Segítenél a  konvertálás megadásában, ne kelljen keresnem .Mint korábban jeleztem kezdő  vagyok.
    kíváncsiságból van ötleted miért nem megy amit csináltam?


    Kipróbáltam, sajnos valami oknál fogva tört számot kapok. Gondolom az időpontok miatt. Nekem csak a napok száma kellene egész értéken
    Vagy ez így nem jó?

    $date=date_create();
    echo 'Eredmény = '.date_timestamp_get($date);
    Mutasd a teljes hozzászólást!
  • Lehet nem a legszebb megoldás de sikeres.
    $nap1=(date_parse($datum1));
    $nap2=(date_parse($datum2)); 

    A kapott tömbből kiemelve a napot tudok vele számolni.
    Mutasd a teljes hozzászólást!
  • Hali!

    A kapott tömbből kiemelve a napot tudok vele számolni.

    Hogyan számolsz vele?

    A DateTime::diff()-fel mi volt a gond? Az eredményének days tagváltozója pont azt adja, ami neked kell, pl.:
    $date1 = new \DateTime($sor['p_datum']); $date2 = new \DateTime('now'); $diff = $date1->diff($date2); $days = ($diff->invert ? -1 : 1) * $diff->days;
    Mutasd a teljes hozzászólást!
  • Köszi .A gondom, hogy nem tudtam megfelelően használni. Erre vonatkozott a kérdésem. Mint írtam egy másik lehetőséget találtam amivel sikerült megoldanom (date_parse($datum));

    NevemTeve válaszát azért értékeltem, mert értékesnek találtam a további felhasználáskor. Nem gondoltam erre az eshetőségre-
    Mutasd a teljes hozzászólást!
  • Hali!

    Mint írtam egy másik lehetőséget találtam amivel sikerült megoldanom (date_parse($datum));

    És hogyan számolsz vele (mint kérdeztem korábban is)? Különösen a „kapott tömbből kiemelve a napot” rész érdekelne – mondjuk, ha $datum1 értéke 2020-01-01 00:00:00, $datum2 értéke pedig 2021-03-25 00:00:00. Hogy' lesz a két date_parse() által visszaadott tömbből a két dátum közötti napok száma?

    Mutasd a teljes hozzászólást!
  • Mint írtam lehet nem a legszebb megoldás, de nekem a próba dátumokkal működik.
      $datum=$sor['p_datum']; //dátum a táblából
        $ma=date("Y-m-d H:i:s"); //aktuális dátum                                                                           

        $nap2=(date_parse($datum));   
        $nap1=(date_parse($ma));   
        $nap1=$nap1[day];
        $nap2=$nap2[day]; 
        $nap3=$nap1-$nap2;    
        echo "<br>Össz=&nbsp;"."$nap3";

    Mivel egy héten belül van szükségem az eltérésre, ezért elégségesnek tünt ez a megoldás.
    Az általad javasolta is kipróbálom Kezdő létemre nem igazán értem minden sorát. Megpróbálom értelmezni.  A a tényleges napok különbségére lesz szükségem, segíteni fog a mgoldásban. Köszönöm
    Mutasd a teljes hozzászólást!
  • Hali!

    … de nekem a próba dátumokkal működik.

    Azaz, olyan dátumokkal, amik ugyanabban a hónapban vannak. Ha a problémád ez volt, akkor tényleg megoldást találtál. Viszont, ez akkor azt is jelenti, hogy pl. '2020-01-01' és '2021-03-25' dátumok esetén a „megoldásod” 24-et fog adni (a 449 helyett). Persze, ha az adatbázisodban csak olyan dátumok lehetnek, amik ugyanabban az évben és ugyanabban a hónapban vannak, mint az éppen aktuális nap…

    Mutasd a teljes hozzászólást!
  • Mondjuk nézzünk egy példát, ahol órában számolunk, egyszer localtime-ban, egyszer utc-ben:

    #!/usr/local/bin/php <?php $s1= "2021-03-27 04:00:00"; $s2= "2021-03-28 04:00:00"; $localtime= timezone_open ("Europe/Budapest"); $lt1= date_create ($s1, $localtime); $lt2= date_create ($s2, $localtime); $lsec1= date_timestamp_get($lt1); $lsec2= date_timestamp_get($lt2); $lt_diff= $lsec2-$lsec1; printf ("localtime(\"%s\")=%d\n". "localtime(\"%s\")=%d\n". "delta=%ds=%dh\n", $s1, $lsec1, $s2, $lsec2, $lt_diff, $lt_diff/3600); $gmt= timezone_open ("GMT"); $gt1= date_create ($s1, $gmt); $gt2= date_create ($s2, $gmt); $gsec1= date_timestamp_get($gt1); $gsec2= date_timestamp_get($gt2); $gt_diff= $gsec2-$gsec1; printf ("gmtime(\"%s\")=%d\n". "gmtime(\"%s\")=%d\n". "delta=%ds=%dh\n", $s1, $gsec1, $s2, $gsec2, $gt_diff, $gt_diff/3600); ?>
    Ilyen lenne a kimenet:

    localtime("2021-03-27 04:00:00")=1616814000 localtime("2021-03-28 04:00:00")=1616896800 delta=82800s=23h gmtime("2021-03-27 04:00:00")=1616817600 gmtime("2021-03-28 04:00:00")=1616904000 delta=86400s=24h
    Mutasd a teljes hozzászólást!
  • Szia! Nem hagyott nyugodni, amit írtál. Tényleg  korrekt különbséggel kellene megírni.  Most reggel lefuttattam amit írtál. Meglepetésemre ugyan azt a hibát hozza mint az én legelső  változatom. 
    ma 26.-a van. A tárol 2021-03-24 14:16:17 re 1 et, 25.-ére 0 -t 26-ra 0-át  át 27-ére -1 et ad. 

    Valamit olvastam, de nem találom most hirtelen, " csak pozitív eredmény lehet azt korrigálni kell"?

    Nem lehet  hasonló problémám. ? Ezt a sort nem értem,,, esetleg itt korrigálod?
    $days = ($diff->invert ? -1 : 1) * $diff->days;

    Ebben tudnál segíteni, miért csal?
    Mutasd a teljes hozzászólást!
  • Kérlek csinálj egy mcve-t (önmagában kipróbálható, minimális példaprogramot, ami mutatja a hibát), és azt fájlként csatold.
    How to create a Minimal, Reproducible Example - Help Center
    Mutasd a teljes hozzászólást!
  • Mellékelem a hibás prg. részletet
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Hali!

    Ezt a sort nem értem,,, esetleg itt korrigálod?

    A DateInterval osztály invert tagváltozója jelzi, hogy negatív különbség van-e a két időpont között. Vegyük pl. a következő két dátumot: 2021-03-23 és 2021-03-26:
    $date1 = new \DateTime('2021-03-23'); $date2 = new \DateTime('2021-03-26');
    Ha a differenciát $date1-en veszed $date2-re vonatkoztatva (azaz, a korábbi dátum a későbbire vonatkoztatva):
    $diff = $date1->diff($date2);
    akkor a days értéke 3 lesz, az invert értéke pedig 0 (jelezve, hogy eltelt különbségről van szó). Viszont, ha a $date2-n képzed a különbséget $date1-re vonatkoztatva (azaz, a későbbi dátum a korábbira):
    $diff = $date2->diff($date1);
    akkor a days értéke ugyanúgy 3 lesz, az invert értéke pedig 1 (mutatva, hogy jövőbeni különbségről van szó). Az illető kóddal csak annyit csinálok, hogy az invert függvényében negatívvá alakítom a days értékét. Természetesen, ha neked lényegtelen ez, akkor veheted csak simán a days értékét is.

    Ebben tudnál segíteni, miért csal?

    Nem csal, csak az időpontok (óra, perc…) alapján nem jön ki egész nap. Ha függetlenül az időponttól szeretnéd az eltelt napok számát meghatározni (azaz, csak a dátum-rész érdekel), akkor töröld az időpont-részt (azaz, állítsd 00:00:00-ra), pl.:
    $date1 = (new \DateTime($datum))->setTime(0, 0, 0, 0); $date2 = (new \DateTime('now'))->setTime(0, 0, 0, 0); $diff = $date1->diff($date2); $days = ($diff->invert ? -1 : 1) * $diff->days;
    Mutasd a teljes hozzászólást!
  • Nagyon köszönöm, hasznos és értékes tanácsaidat.

    Az idö 0 ra minden úgy működik ahogy szeretném.
    Ezt  én az első verziómnál is észrevettem, csak nem tudtam, hogy kell leválasztani az órát, azért gondoltam, hogy valamit rosszul csinálok.
    Mutasd a teljes hozzászólást!
  • Ilyesmi tesztprogramot lehetne elképzelni:

    <?php function test1 ($reg, $most) { $dreg = new DateTime($reg); $dmost= new DateTime($most); $diff = $dreg->diff($dmost); printf ("diff(\"%s\" - \"%s\"): days=%d hours=%d\n", $most, $reg, $diff->days, $diff->h); } date_default_timezone_set("Europe/Budapest"); test1 ("2021-03-25 16:47:00", "2021-03-28 01:47:00"); test1 ("2021-03-25 16:47:00", "2021-03-28 02:47:00"); test1 ("2021-03-25 16:47:00", "2021-03-28 03:47:00"); test1 ("2021-03-25 16:47:00", "2021-03-28 15:47:00"); test1 ("2021-03-25 16:47:00", "2021-03-28 16:47:00"); test1 ("2021-03-25 16:47:00", "2021-03-28 17:47:00"); ?>
    (Lásd még ezt.)
    Mutasd a teljes hozzászólást!
  • Köszönöm segítséged. Sikerült megoldanom.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd