Magyar

Átfogó útmutató a JavaScript Temporal API használatához a pontos és intuitív időintervallum-számításokhoz, a legalapvetőbb időtartam-létrehozástól a fejlett aritmetikáig és formázásig.

JavaScript Temporal Duration: Időtartam-számítások elsajátítása

A JavaScript Temporal API egy modern és hatékony módszert kínál a dátumok, idők és időintervallumok kezelésére. A Temporal.Duration objektum egy időtartamot reprezentál, amely tiszta és intuitív megközelítést biztosít az időintervallumokkal végzett számításokhoz. Ez a cikk a Temporal.Duration részleteibe merül, bemutatva, hogyan lehet időtartamokat létrehozni, manipulálni és formázni a különböző felhasználási esetekhez.

Mi az a Temporal.Duration?

A Temporal.Duration egy időtartamot képvisel, években, hónapokban, napokban, órákban, percekben, másodpercekben és a másodperc töredékeiben (ezredmásodpercekben, mikromásodpercekben, nanoszekundumban) fejezve ki. A Date objektumokkal ellentétben, amelyek egy adott időpontot képviselnek, a Temporal.Duration egy időmennyiséget képvisel. Megfelel az ISO 8601 időtartam formátumnak (pl. a P1Y2M10DT2H30M 1 évet, 2 hónapot, 10 napot, 2 órát és 30 percet jelent). A Temporal API-t úgy tervezték, hogy intuitívabb és kevésbé hibás legyen, mint az örökölt Date objektum.

Temporal.Duration objektumok létrehozása

Számos módon létrehozhatók Temporal.Duration objektumok:

1. Egy egyszerű objektumból

Létrehozhat egy időtartamot úgy, hogy egy objektumot ad meg a kívánt tulajdonságokkal:

const duration = new Temporal.Duration(1, 2, 10, 2, 30, 0, 0, 0);
console.log(duration.toString()); // Kimenet: P1Y2M10DT2H30M

Ez 1 év, 2 hónap, 10 nap, 2 óra és 30 perc időtartamot hoz létre. Ne feledje, hogy az argumentumok a következő sorrendnek felelnek meg: évek, hónapok, hetek, napok, órák, percek, másodpercek, ezredmásodpercek, mikromásodpercek, nanoszekundumok.

2. Egy ISO 8601 karakterláncból

Létrehozhat egy időtartamot egy ISO 8601 időtartam karakterláncból is a Temporal.Duration.from() használatával:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.toString()); // Kimenet: P1Y2M10DT2H30M

Ez különösen hasznos, ha karakterlánc formátumban tárolt vagy külső forrásból kapott időtartamokkal foglalkozunk.

3. A add() és subtract() metódusok használata a Temporal.Instant, Temporal.ZonedDateTime stb. használatával

Ha Temporal.Duration-t ad hozzá vagy von ki más Temporal típusokból (például Temporal.Instant vagy Temporal.ZonedDateTime), egy Temporal.Duration értéket kap vissza, amely a két időpont közötti különbséget képviseli, ha utána kivonja őket. Például:

const now = Temporal.Now.zonedDateTimeISO();
const later = now.add({ hours: 5 });
const duration = later.since(now);
console.log(duration.toString()); // Kimenet: PT5H

Az időtartam komponenseinek elérése

A Temporal.Duration objektum egyes komponenseit a tulajdonságai segítségével érheti el:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.years);      // Kimenet: 1
console.log(duration.months);     // Kimenet: 2
console.log(duration.days);       // Kimenet: 10
console.log(duration.hours);      // Kimenet: 2
console.log(duration.minutes);     // Kimenet: 30
console.log(duration.seconds);     // Kimenet: 0
console.log(duration.milliseconds); // Kimenet: 0
console.log(duration.microseconds); // Kimenet: 0
console.log(duration.nanoseconds);  // Kimenet: 0

Aritmetikai műveletek végzése az időtartamokkal

A Temporal.Duration objektumok támogatják az összeadást és a kivonást az add() és a subtract() metódusok segítségével. Ezek a metódusok egy új Temporal.Duration objektumot adnak vissza, amely a művelet eredményét reprezentálja.

const duration1 = Temporal.Duration.from("P1Y2M");
const duration2 = Temporal.Duration.from("P3M4D");

const addedDuration = duration1.add(duration2);
console.log(addedDuration.toString()); // Kimenet: P1Y5M4D

const subtractedDuration = duration1.subtract(duration2);
console.log(subtractedDuration.toString()); // Kimenet: P10M26D

Ezeket a metódusokat láncolhatja a bonyolultabb számításokhoz:

const duration = Temporal.Duration.from("P1D").add({ hours: 12 }).subtract({ minutes: 30 });
console.log(duration.toString()); // Kimenet: P1DT11H30M

A negated() metódus egy új Temporal.Duration objektumot ad vissza, ahol minden komponens negált:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const negatedDuration = duration.negated();
console.log(negatedDuration.toString()); // Kimenet: -P1Y2M10DT2H30M

Az abs() metódus egy új Temporal.Duration objektumot ad vissza, ahol minden komponens pozitív érték (abszolút érték):

const duration = Temporal.Duration.from("-P1Y2M10DT2H30M");
const absoluteDuration = duration.abs();
console.log(absoluteDuration.toString()); // Kimenet: P1Y2M10DT2H30M

A with() metódus lehetővé teszi, hogy egy új Temporal.Duration példányt hozzon létre, amelynek egyes vagy az összes tulajdonsága új értékekre változott. Ha egy értéket nem ad meg az argumentum objektumban, akkor az időtartam eredeti értékét fogja használni. Például:

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const newDuration = duration.with({ years: 2, days: 5 });
console.log(newDuration.toString()); // Kimenet: P2Y2M5DT2H30M

Időtartamok normalizálása

Az időtartamok néha nem normalizált formában is kifejezhetők (pl. P1Y12M, amely P2Y-ra egyszerűsíthető). A normalized() metódus megpróbálja a lehető legkompaktabb formára egyszerűsíteni az időtartamot. Ehhez azonban egy referencia dátumra van szükség a változó hónapok hosszának kezeléséhez. A megfelelő normalizáláshoz Temporal.PlainDate, Temporal.ZonedDateTime vagy Temporal.Instant példányra van szükség.

Például a hónapokat és napokat tartalmazó időtartam normalizálásához referencia dátumra van szükség:

const duration = Temporal.Duration.from("P1M32D");
const referenceDate = Temporal.PlainDate.from("2024-01-01");
const normalizedDuration = duration.normalized({ relativeTo: referenceDate });
console.log(normalizedDuration.toString()); // Kimenet: P2M1D

Ebben a példában a P1M32D időtartam a 2024. január 1-hez képest van normalizálva, ami P2M1D-t eredményez, mert januárban 31 nap van.

Ha csak idő komponensekkel foglalkozik (órák, percek, másodpercek stb.), akkor referencia dátum nélkül is normalizálhat:

const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //vagy hagyja ki a relativeTo argumentumot
console.log(normalizedDuration.toString()); // Kimenet: P1DT2H1M

Időtartamok összehasonlítása

Az időtartamokat a compare() metódussal hasonlíthatja össze. Ez a metódus a következőket adja vissza:

const duration1 = Temporal.Duration.from("P1Y");
const duration2 = Temporal.Duration.from("P6M");

const comparisonResult = Temporal.Duration.compare(duration1, duration2);
console.log(comparisonResult); // Kimenet: 1

Gyakorlati példák

1. Eseményig hátralévő idő számítása

Tegyük fel, hogy ki szeretné számolni a hátralévő időt egy adott eseményig. A Temporal.Now.zonedDateTimeISO() segítségével lekérheti az aktuális időt, és kivonhatja az esemény dátumát. Ha az esemény dátuma elmúlt, a kimenet negatív lesz.

const eventDate = Temporal.ZonedDateTime.from({ timeZone: 'America/Los_Angeles', year: 2024, month: 12, day: 25, hour: 9, minute: 0, second: 0 });
const now = Temporal.Now.zonedDateTimeISO('America/Los_Angeles');

const durationUntilEvent = eventDate.since(now);

console.log(durationUntilEvent.toString()); // Kimenet: pl. P262DT14H30M (az aktuális dátumtól és időponttól függően)

2. Projekt feladatok időtartamának nyomon követése

A projektmenedzsmentben a Temporal.Duration segítségével nyomon követheti a feladatok becsült vagy tényleges időtartamát.

const task1EstimatedDuration = Temporal.Duration.from("PT8H"); // 8 óra
const task2EstimatedDuration = Temporal.Duration.from("PT16H"); // 16 óra

const totalEstimatedDuration = task1EstimatedDuration.add(task2EstimatedDuration);
console.log(`Total estimated duration: ${totalEstimatedDuration.toString()}`); // Kimenet: Total estimated duration: P1DT

3. Kor számítása

Bár a kor pontos kiszámítása a szökőéveket és az időzónákat is figyelembe veszi, a Temporal.Duration elfogadható becslést adhat:

const birthDate = Temporal.PlainDate.from("1990-05-15");
const currentDate = Temporal.PlainDate.from("2024-01-20");

const ageDuration = currentDate.since(birthDate, { smallestUnit: 'years' });
console.log(`Estimated age: ${ageDuration.years} years`); // Kimenet: Estimated age: 33 years

4. Emberileg olvasható időtartamok megjelenítése

Gyakran előfordul, hogy emberileg olvasható formátumban kell megjeleníteni az időtartamokat. Bár a Temporal.Duration nem rendelkezik beépített formázó funkciókkal, létrehozhat egyéni formázási logikát:

function formatDuration(duration) {
  const parts = [];
  if (duration.years) parts.push(`${duration.years} year${duration.years > 1 ? 's' : ''}`);
  if (duration.months) parts.push(`${duration.months} month${duration.months > 1 ? 's' : ''}`);
  if (duration.days) parts.push(`${duration.days} day${duration.days > 1 ? 's' : ''}`);
  if (duration.hours) parts.push(`${duration.hours} hour${duration.hours > 1 ? 's' : ''}`);
  if (duration.minutes) parts.push(`${duration.minutes} minute${duration.minutes > 1 ? 's' : ''}`);
  if (duration.seconds) parts.push(`${duration.seconds} second${duration.seconds > 1 ? 's' : ''}`);

  return parts.join(', ');
}

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // Kimenet: 1 year, 2 months, 10 days, 2 hours, 30 minutes

Haladó használat és megfontolások

1. Időzóna kezelése

Ha olyan időintervallumokkal foglalkozik, amelyek átlépik az időzónahatárokat vagy a nyári időszámítás-váltásokat, elengedhetetlen a Temporal.ZonedDateTime használata a pontos számítások biztosítása érdekében. A Temporal.PlainDate és Temporal.PlainTime használatával elkerülheti az időzóna-átváltásokat.

2. Legkisebb egység és kerekítés

A since() és until() metódusok gyakran fogadják az opciókat az eredményül kapott időtartam legkisebb egységének meghatározásához. Például egy eseményig *tartó* idő kiszámítása, és az eredményeket napokra korlátozása.

const eventDate = Temporal.PlainDate.from("2024-12-25");
const now = Temporal.PlainDate.from("2024-01-20");

const durationUntilEvent = now.until(eventDate, { smallestUnit: 'days' });

console.log(durationUntilEvent.toString()); //például PT340D

3. Szökőmásodpercek

A Temporal nem veszi figyelembe a szökőmásodperceket. Ha extrém pontosságra van szüksége, akkor a szökőmásodperceket külön kell kezelnie.

4. IANA időzónák

A Temporal API az IANA (Internet Assigned Numbers Authority) időzóna-adatbázisára támaszkodik. Győződjön meg arról, hogy a környezetében az IANA adatbázis naprakész verziója van, hogy pontosan kezelje az időzóna-átváltásokat.

Legjobb gyakorlatok

Gyakori buktatók

Valós felhasználási esetek a különböző kultúrákban

A Temporal API különösen előnyös lehet a globális alkalmazásokban, ahol az időzóna-különbségek és a kulturális árnyalatok jelentősek. Íme néhány példa:

Következtetés

A Temporal.Duration robusztus és intuitív módot kínál a JavaScriptben az időintervallumokkal való munkához. A funkcióinak és a legjobb gyakorlatoknak a megértésével magabiztosan végezhet pontos és megbízható időtartam-számításokat az alkalmazásaiban. A Temporal API átvétele tisztább, karbantarthatóbb kódot eredményez, és csökkenti az örökölt dátum- és időkezeléshez kapcsolódó hibák kockázatát.

Ahogy mélyebbre ás a Temporal API-ban, ne felejtse el kikérni a hivatalos dokumentációt, és kísérletezzen a különböző forgatókönyvekkel, hogy teljes mértékben megértse a képességeit. Modern dizájnjával és átfogó funkcióival a Temporal arra hivatott, hogy forradalmasítsa a dátumok, idők és időtartamok kezelését a JavaScriptben.