Kurzusok
/
JavaScript
JavaScript
/
Feladatok
/
Időpont-egyeztetés
Időpont-egyeztetés

Időpont-egyeztetés

Tanulófeladat

Bevezetés

A JavaScript rendelkezik egy beépített Date objektummal, amely dátumot és időt tárol, és metódusokat kínál a kezelésükhöz.

Caution

A Java java.util.Date osztályán alapult, amelyet a 2010-es évek elején lecseréltek, de a visszafelé kompatibilitás miatt a JavaScript Date megmaradt.

Mivel általában nehéz a dátumokkal dolgozni, és mivel az időzónakezelés gyenge vagy egyáltalán nem létezik, sok könyvtár született, például a moment.js, a day.js, a date-fns és a luxon. Ezek egyike sem érhető el az Exercism-ön.

A saját projektjeidben ne használj elavult / nem karbantartott csomagot, például a moment.js-t, hanem támaszkodj modernebb alternatívákra, mint a luxon, vagy a még nem széles körben elérhető Temporal. Ez a feladat a Date-re összpontosít, amely a JavaScript végéig releváns marad.

Létrehozás

A Date objektum a Date osztály egy példánya. Létrehozható úgy, hogy nem adunk át argumentumot a konstruktorfüggvénynek. Ekkor egy olyan Date objektumot kapunk, amely az aktuális dátumot és időt képviseli:

const now = new Date();
// => Thu Apr 14 2022 11:46:08 GMT+0530 (India Standard Time)
// Shows current day, date and time (in your time zone).

Unix timestamp (szám)

Ha egy számot adunk át, azt timestamp-ként értelmezi. A timestamp egy egész szám, amely az 1970. január 1. UTC+0 óta eltelt ezredmásodpercek számát jelöli.

const epoch = new Date(0);
// Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)

const another = new Date(1749508766627);
// Tue Jun 10 2025 00:39:26 GMT+0200 (Central European Summer Time)

Az ember azt várná, hogy a new Date(0) a „legkorábbi” dátumobjektumot hozza létre, de a JavaScript a helyi időzónádra konvertálja a dátumot, ami azt jelenti, hogy valójában csak azok kapják meg a Unix epoch értéket, akik GMT / UTC+0 időzónában vannak.

ISO 8601 timestamp (string)

Átadhatsz egy dátumot képviselő string értéket a Date konstruktornak. Az egyetlen olyan formátum, amely minden implementációban konzisztens, a nemzetközileg elismert és szabványosított, úgynevezett ISO 8601 timestamp stringek egyszerűsített változata.

Egy pillanat az időben UTC szerint így néz ki:

YYYY-MM-DDTHH:mm:ss.mssZ
YYYYMMDDTHHmmss.mssZ

Ahol a következő helyettesítések történnek:

Kulcs Leírás Alapértelmezés
YYYY A naptári év, 4 számjeggyel ábrázolva
MM A naptári hónap, 2 számjeggyel ábrázolva 01
DD A naptári nap, 2 számjeggyel ábrázolva 01
T A szó szerinti T betű, amely elválasztja a dátumot az időtől
HH Az óra 24 órás formátumban, 2 számjeggyel 00
mm A percek, 2 számjeggyel 00
ss A másodpercek, 2 számjeggyel 00
mss Az ezredmásodpercek, 3 számjeggyel 000
Z A szó szerinti Z betű, vagy egy +/-HH:mm eltolás

A szó szerinti Z betű az UTC-t jelöli (nincs időzóna, nincs nyári időszámítás).

Mivel a legtöbb összetevőnek van alapértelmezett értéke, érvényes, ha a végét elhagyjuk:

YYYY-MM-DD

Alapértelmezésben 00:00:00.000 időre áll be.

Ha a timestamp nem Z-re végződik, és nem végződik +HH:mm-re vagy -HH:mm-re (ami időzóna-eltolást jelez), akkor történelmi okokból a következő érvényes:

Ha az időzóna-eltolás hiányzik, a csak dátumot tartalmazó formák UTC-időként, a dátumot és időt tartalmazó formák pedig helyi időként értelmeződnek. Az UTC-időként való értelmezés egy történelmi specifikációs hiba miatt van, amely nem volt összhangban az ISO 8601-gyel, de a webes kompatibilitás miatt nem lehetett megváltoztatni. Lásd: Broken Parser – A Web Reality Issue.

Caution

Lehet, hogy más, a Date.parse által elfogadott formátumok működnek, de az is lehet, hogy nem. Amikor JavaScriptben dátumokkal dolgozol, string-ből Date-t konvertálva mindig ISO 8601 timestampet használj.

A csak dátumot tartalmazó formák engedélyezettek, de nem minden ISO 8601 formátum támogatott. Nézd meg az egyszerűsített változat magyarázó oldalát az MDN-en.

Date objektum

Egy meglévő dátumobjektum is használható konstruktorargumentumként. Ez lemásolja a meglévő Date objektumot ugyanazzal a dátummal és idővel.

const t1 = new Date();
const t2 = new Date(t1);
// Values of t1 and t2 will be the same.

Az egyes dátum- és időösszetevők értékeinek megadása

Egy dátumot képviselő dátumobjektumot három szám átadásával hozhatsz létre. Egy dátumot és időt képviselőt hat szám átadásával hozhatsz létre.

const date1 = new Date(95, 11, 17);
// Creates Date for Dec 17 1995 00:00 if your local timezone is equivalent to UTC.

const date2 = new Date(2013, 12, 5, 13, 24, 0);
// Creates Date for Jan 5 2014 13:24 if your local timezone is equivalent to UTC.

A második érték a month, amely januárban 0-tól indul, decemberben pedig 11-ig tart.

Date.parse()

Találkozhatsz egy Date.parse nevű dátumfeldolgozó függvény említésével vagy rá mutató hivatkozással. Mivel ennek a függvénynek csak néhány invariánsa (igazsága) van, a többi része pedig nincs specifikálva (és így nem szabványos), nem érdemes használni.

A Date összetevőinek elérése

A dátumobjektumokon több olyan metódus is van, amely visszaadja a dátum összetevőit:

getFullYear(); // Get the year (4 digits)
getMonth(); // Get the month, from 0 to 11.
getDate(); // Get the day of month, from 1 to 31.
getHours(); // Get the hour in a 24 clock, from 0 to 23
getMinutes(); // Get the minutes, from 0 to 59
getSeconds(); // Get the seconds, from 0 to 59
getMilliseconds(); // Get the milliseconds, from 0 and 999
getDay(); // Get the day of week, from 0 (Sunday) to 6 (Saturday).

Mindegyiknek van egy megfelelő set változata (például setFullYear), amellyel frissítheted az értéket. A túlcsorduló érték átfordul a következő összetevőre:

const date = new Date('2025-02-28T12:42:00Z');
// => Fri Feb 28 2025 13:42:00 GMT+0100 (Central European Standard Time)

date.setDate(29);
// there was no February 29th in 2025.

date.getDate();
// => 1

date.toString();
// => Sat Mar 01 2025 13:42:00 GMT+0100 (Central European Standard Time)

Minden metódusnak van UTC-változata, amely figyelmen kívül hagyja a helyi időzónát.

Konvertálás dátumból

A dátumobjektumoknak van egy getTime() metódusuk, amely az UNIX timestampet adja vissza ezredmásodpercben, azaz az 1970. január 1-jei éjfél (UTC) óta eltelt ezredmásodpercek számát. Emellett a toISOString() metódussal egy dátumobjektumot ISO 8601 timestamp stringgé konvertálhatsz.

Dátumok összehasonlítása

A nagyobb mint (>), a nagyobb vagy egyenlő (>=), valamint a kisebb mint (<) és a kisebb vagy egyenlő (<=) operátorok közvetlenül használhatók két dátum között, vagy egy dátum és egy szám között. Ez azért működik, mert a JavaScript automatikus típuskonverzióval primitívre próbálja alakítani a dátumot.

Advanced

Amikor két dátumot, vagy egy dátumot és egy számot hasonlítasz össze, a JavaScript meghívja a [Symbol.toPrimitive]("number") metódust, amely belül a date.valueOf() metódust hívja. Ez utóbbi ugyanaz, mint a date.getTime() hívása.

Ha nem szeretnél erre a viselkedésre támaszkodni, először konvertálj számmá a getTime() segítségével.

A dátumok nem hasonlíthatók össze egyenlőséggel (== és ===), de a .getTime() eredménye igen.

Utasítások

Ebben a feladatban néhány függvényen fogsz dolgozni, hogy időpontokat kezelj. A rendszer mindent ISO 8601 formátumú stringekben tárol, de az emberek nem így használják a naptárat. A különböző formátumok közötti átalakításhoz több függvényre van szükség.

1. Hozz létre egy időpontot

Hozz létre egy időpontot n nappal későbbre, az aktuális időben. A függvény n napot vár, és visszaadja az n nappal későbbi időpontot.

createAppointment(4, now);
// Given now is Sun Oct 05 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)
// => Sun Oct 09 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)

Ha a második now paraméter nincs megadva, akkor helyette az aktuális időt kell használni.

2. Alakítsd át a dátumot időbélyeggé

Számos eszköz csak a nemzetközileg szabványosított ISO 8601 formátummal működik. Írd meg a getAppointmentTimestamp függvényt, amely egy dátumot vesz át, és egy ilyen formátumú stringet ad vissza.

const appointment = new Date(Date.UTC(2010, 6, 16, 12, 42, 0, 0));

getAppointmentTimestamp(appointment);
// => '2010-07-16T12:42:00.000Z'

3. Kérd le egy időpont részleteit

Az időbélyegeket nehéz olvasni, ebben segíthet egy függvény, amely lekéri az időpont részleteit. A getAppointmentDetails függvény egy ISO 8601 formátumú időbélyeget vesz át, és visszaadja az évet, a hónapot, a napot, az órát és a percet.

getAppointmentDetails('2022-04-24T08:15:00.000');
// => { year: 2022, month: 3, date: 24, hour: 8, minute: 15 }

4. Frissítsd az időpontot a megadott opciókkal

A függvény első argumentuma az időpont, a második pedig egy objektum, amely néhány opciót tartalmaz. Az objektumban lévő opciók szerint frissítened kell az időpontot, és vissza kell adnod az új időpont dátumát. Az opciókat tartalmazó objektumban több opció is lehet.

updateAppointment('2022-02-09T09:20:00.000', { month: 6 });
// => { year: 2022, month: 6, date: 9, hour: 10, minute: 20 }

5. Számítsd ki a két időpont közötti rendelkezésre álló időt

A függvény két időpontot (időbélyeget) kap argumentumként. A két időpont közötti különbséget másodpercben kell visszaadnod.

Mivel a fél másodperc szinte semmit sem jelent, kerekítsd a számot, mielőtt visszaadod.

timeBetween('2022-12-12T09:20:00.000', '2022-12-18T08:30:00.000');
// => 515400

6. Ellenőrizd, hogy egy időpont érvényes-e

Végül, amikor az időpontot létrehozzák, a rendszernek ellenőriznie kell, hogy érvényes-e. Más szóval az időpontnak a jövőben kell lennie, nem a múltban.

Írd meg az isValid függvényt, amely két argumentumot vár: egy időpont-időbélyeget (string) és az aktuális időt mint időbélyeget (string), és true-t ad vissza, ha az időpont a jövőben van az aktuális időhöz képest.

isValid('2022-02-11T23:00:00.000', '2022-02-08T23:00:00.000');
// => true
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
JavaScript Exercism

Készen állsz elkezdeni a(z) Időpont-egyeztetés feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) JavaScript nyelvet 37 fogalom159 feladat segítségével, valódi emberi mentorálással, mindez ingyen.