Javascript dátumkezelés böngészőfüggetlenül
2017-09-04T09:55:26+02:00
2017-09-05T11:13:11+02:00
2022-07-21T11:06:58+02:00
  • pl: nyáron 16:15 időpont mentve, de télen ez már csak 15:15 lesz ha a timezoneoffset-tel megy a számolás

    Ezt nem igazán értem, a nyári időpont nem lesz téli, pl. a 2017.09.05 16:15 az mindig annyi lesz.
    Ha arra gondolsz, hogy télen csak egy óra az eltérés nálunk az UTC-hez képest, míg most kettő, akkor igen, így van.
    Tehát pl. a  2017-09-05T14:15:00.700Z UTC idő, az 2017.09.05 16:15 helyi (Europe/Budapest) idő esetén, de a 2017-11-05T14:15:00.700Z UTC idő, az 2017.11.05 15:15 helyi (Europe/Budapest) idő esetén. Első esetben a timezoneOffset -120, a másodikban -60 kellene legyen.

    A Safari-nak is elvileg jól kellene működnie, mert a támogatott böngészőknél rajta van mind Internationalization API esetén, mind a Date#toISOString esetén.
    Egyébként mit ad vissza a Date#toISOString (new Date().toISOString()) Safari esetén?

    és persze a böngésző beállítás még nem került szóba.

    A böngészőknél ezt szerintem nem lehet állítani, bár lehet, hogy némelyiknél igen, ezt inkább az OS szintjén lehet csak állítani. Ezzel viszont nincs baj, mert az adott felhasználó a beállításoknak megfelelő időt kívánja látni. Pl. hiába vagyok Amerikában én a Budapesti időt szeretném látni vagy fordítva.

    Ha a Date#toISOString által visszaadott értéket mented az adatbázisba, majd az alapján íratod ki mindenkinek a saját helyi idejét (pl. js esetén new Date(Date.parse(isostring)) -gel képzed), akkor ez szerintem jó megoldás.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • És akkor ez megoldja a nyári/téli időszámítás problémát, amit korábban felvetettem? 
    pl: nyáron 16:15 időpont mentve, de télen ez már csak 15:15 lesz ha a timezoneoffset-tel megy a számolás, és persze a böngésző beállítás még nem került szóba.
    Mert pl: chrome-ban ez az én gépemen -120, de a safariban a munkatársam gépén ez az érték csak -60.
    Mutasd a teljes hozzászólást!
  • A Moment Timezone az, amire szükséged van, de lehet natív eszközökkel is, ahogy a Moment Timezone is csinálja:

    Moment Timezone uses the Internationalization API (
    Intl.DateTimeFormat().resolvedOptions().timeZone
    ) in supported browsers to determine the user's time zone.

    On other browsers, time zone detection is rather tricky to get right, as there is little information provided by those browsers. For those, it will use
    Date#getTimezoneOffset
    and
    Date#toString
    on a handful of moments around the current year to gather as much information about the browser environment as possible. It then compares that information with all the time zone data loaded and returns the closest match. In case of ties, the time zone with the city with largest population is returned.
    Mutasd a teljes hozzászólást!
  • a timezone-t nem használtam, mert a locale függvénnyel is valami hasonlót lehet (vagy mégse??), de örülnék, ha "natív" js-sel is meg lehetne oldani, illetve inkább az elmélet érdekelne
    Mutasd a teljes hozzászólást!
  • moment.js-t írtad, de moment-timezone-t is használtad hozzá?
    Moment Timezone
    Mutasd a teljes hozzászólást!
  • Eleg sok itt a problema.
    Probald ki a DateJS-t. Ennek van timezone es daylight kezeloje (daylight=nyari/teli idoszamitas)
    Safari az mindig is kulonutas volt a bongeszok vilagaban. Safari esetben neked kell kezileg parsolni az adatokat.
    Nalam anno az ilyen applikacional az volt, hogy mutattuk a helyi idot es a PCT (Californiai volt a foidozona) idozonat is.
    Illetve anno ezzel a szep kis megoldassal jatszottam.  A Suffix is jelzi az idozona kulonbsegeket.
    Timepickerek mar csak ilyenek, azok maguk tudjak vagy nem kezelni az ilyen idokulonbsegeket.

    Erdemes mindkettot mutatni, az egyik lehet kisebb betumerettel stb. De jo ha ott van mindketto verzio a felhasznolnak. Hidd el, mi fejlesztok is neha belekavaradtunk :).
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Egy összetett problémám lenne, és sok mindent kipróbáltam már, de nem jutok egyről a kettőre.
    A probléma a következő:
    A szerveren a dátumok a különböző adatokhoz (projekt, bejegyzés, stb), általában UTC dátummal vannak eltárolva a mysql-ben, viszont a front-enden ugye mindig az aktuális időzóna alapján kell feldolgozni az adatokat. Pl ha felvisznek egy projektet, mondjuk 2017-06-14-én 16:51 perckor, akkor ezt szépen ki is lehet iratni, elmenteni, stb, de ha egy timepickerbe töltöm be, hogy szerkeszteni lehessen, akkor ott már hozzászámolja a +2 órát a böngésző, így ott már a 18:51 jelenik meg. A php frameworkok általában a datetime formát használják pl a created_at illetve updated_at oszlopokban a mysql-ben, így azt vissza kell alakítani timestamp formátumra, mert pl a Safari nem tudja kezelni a "2017-05-15 12:15:24" formátumot a new Date()-tel (legalább is nálam hibára fut...). 
    A moment.js elvileg lekezeli, de valahogy mégsem az igazi sokszor, lehet, hogy valamit rosszul használok, de ugye az is befolyásolhatja, ha valaki nem magyar kiadást használ, stb. Szóval van egy pár eset, amikor nem jó...
    A timestamp vagy time formátumnál azért maradtam, mert akkor kiküszöbölöm a midenféle string konverziót, de az idő még mindig nem jó. Aztán ugye ott van egy remek parancs a javascriptben new Date().getTimezoneOffset() ami visszaadja az utc-hez képest lévő különbséget. 
    Ezt egy cookieban tárolom, így mind a Front-end, mind a back-end részére eljut az infó, és mind a két oldalon kezelni lehet a dolgot. Na de ugye itt jön be még egy hiba, hogy a nyári/téli időszmításnál más-más időt ír, hiszen ha augusztusban (2017-08-17 16:15:24) mondjuk egy cikket ír valaki, akkor azt úgy mentem el, hogy (2017-08-17 14:15:24), mert ugye az az utc idő. Aztán ha módosítani szeretné ezt decemberben, akkor viszont már csak 1 óra az eltérés, így én azt kapom vissza backe-endről, hogy  2017-08-17 14:15:24 és ehhez már csak 1 órát adok, (vagy a böngésző input mezője), így a végeredmény 2017-08-17 15:15:24 az eredeti 16:15:24 volt. 
    És ezek ugye csak a magyarországi viszonyok. ha alapból más időzónából szerkeszti, más országból, akkor megy ugye nagyobb a különbség. 
    Erre milyen bevált megoldás van? Hogyan lehet kiküszöbölni, áthidalni ezt a hibát? Van erre valami bevált dolog? 

    Előre is köszi a konstruktív hozzászólásokat :)

    Szobek
    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