Slovenščina

Obsežen vodnik za uporabo JavaScript Temporal API za natančne in intuitivne izračune časovnih intervalov, ki zajema vse od osnovnega ustvarjanja trajanja do napredne aritmetike in oblikovanja.

JavaScript Temporal Duration: Obvladovanje izračunov časovnih intervalov

JavaScript Temporal API uvaja sodoben in zmogljiv način za obravnavo datumov, časov in časovnih intervalov. Objekt Temporal.Duration predstavlja dolžino časa, kar zagotavlja jasen in intuitiven pristop k izvajanju izračunov s časovnimi intervali. Ta članek se poglablja v podrobnosti Temporal.Duration in prikazuje, kako ustvariti, manipulirati in oblikovati trajanja za različne primere uporabe.

Kaj je Temporal.Duration?

Temporal.Duration predstavlja časovno obdobje, ki ga izraža v letih, mesecih, dnevih, urah, minutah, sekundah in delih sekunde (milisekunde, mikrosekunde, nanosekunde). Za razliko od objektov Date, ki predstavljajo določeno točko v času, Temporal.Duration predstavlja količino časa. Ustreza formatu trajanja ISO 8601 (npr. P1Y2M10DT2H30M predstavlja 1 leto, 2 meseca, 10 dni, 2 uri in 30 minut). Temporal API je zasnovan tako, da je bolj intuitiven in manj nagnjen k napakam kot zastareli objekt Date.

Ustvarjanje objektov Temporal.Duration

Obstaja več načinov za ustvarjanje objektov Temporal.Duration:

1. Iz navadnega objekta

Trajanje lahko ustvarite tako, da posredujete objekt z želenimi lastnostmi:

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

To ustvari trajanje 1 leto, 2 meseca, 10 dni, 2 uri in 30 minut. Upoštevajte, da argumenti ustrezajo naslednjemu vrstnemu redu: leta, meseci, tedni, dnevi, ure, minute, sekunde, milisekunde, mikrosekunde, nanosekunde.

2. Iz niza ISO 8601

Trajanje lahko ustvarite tudi iz niza trajanja ISO 8601 z uporabo Temporal.Duration.from():

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

To je še posebej uporabno, ko imate opravka s trajanjem, shranjenim v obliki niza ali prejetim iz zunanjega vira.

3. Uporaba metod add() in subtract() z Temporal.Instant, Temporal.ZonedDateTime itd.

Ko dodate ali odštejete Temporal.Duration od drugih tipov Temporal (kot sta Temporal.Instant ali Temporal.ZonedDateTime), se vrne Temporal.Duration, ki predstavlja razliko med dvema točkama v času, če ju nato odštejete. Na primer:

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

Dostop do komponent trajanja

Do posameznih komponent objekta Temporal.Duration lahko dostopate z uporabo njegovih lastnosti:

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

Izvajanje aritmetike s trajanjem

Objekti Temporal.Duration podpirajo seštevanje in odštevanje z uporabo metod add() in subtract(). Ti metodi vrneta nov objekt Temporal.Duration, ki predstavlja rezultat operacije.

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

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

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

Te metode lahko tudi verižite za bolj zapletene izračune:

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

Metoda negated() vrne nov objekt Temporal.Duration z vsemi komponentami, ki so negirane:

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

Metoda abs() vrne nov objekt Temporal.Duration z vsemi komponentami kot pozitivnimi vrednostmi (absolutne vrednosti):

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

Metoda with() vam omogoča ustvarjanje nove instance Temporal.Duration z nekaterimi ali vsemi lastnostmi, spremenjenimi v nove vrednosti. Če vrednost ni določena v argumentnem objektu, se uporabi prvotna vrednost trajanja. Na primer:

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

Normalizacija trajanj

Trajanja se lahko včasih izrazijo v nenormalizirani obliki (npr. P1Y12M, kar bi lahko poenostavili na P2Y). Metoda normalized() poskuša poenostaviti trajanje v njegovo najbolj kompaktno obliko. Vendar pa zahteva referenčni datum za obravnavo zapletenosti spreminjajočih se dolžin mesecev. Za pravilno normalizacijo boste potrebovali instanco Temporal.PlainDate, Temporal.ZonedDateTime ali Temporal.Instant.

Na primer, normalizacija trajanja, ki vključuje mesece in dneve, zahteva referenčni datum:

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

V tem primeru se trajanje P1M32D normalizira glede na 1. januar 2024, kar ima za posledico P2M1D, ker ima januar 31 dni.

Če imate opravka samo s časovnimi komponentami (ure, minute, sekunde itd.), lahko normalizirate brez referenčnega datuma:

const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //ali izpustite argument relativeTo
console.log(normalizedDuration.toString()); // Output: P1DT2H1M

Primerjava trajanj

Trajanja lahko primerjate z metodo compare(). Ta metoda vrne:

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

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

Praktični primeri

1. Izračun časa do dogodka

Recimo, da želite izračunati čas, ki je še ostal do določenega dogodka. Uporaba Temporal.Now.zonedDateTimeISO() za pridobitev trenutnega časa in odštevanje datuma dogodka. Če je datum dogodka že mimo, bo izhod negativen.

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()); // Output: npr. P262DT14H30M (odvisno od trenutnega datuma in časa)

2. Sledenje trajanjem projektnih nalog

Pri vodenju projektov lahko uporabite Temporal.Duration za sledenje ocenjenemu ali dejanskemu trajanju nalog.

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

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

3. Izračun starosti

Medtem ko natančen izračun starosti zahteva upoštevanje prestopnih let in časovnih pasov, lahko Temporal.Duration zagotovi razumno oceno:

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`); // Output: Estimated age: 33 years

4. Prikaz človeku berljivih trajanj

Pogosto morate trajanja prikazati v človeku berljivi obliki. Medtem ko Temporal.Duration nima vgrajenih funkcij za oblikovanje, lahko ustvarite logiko oblikovanja po meri:

function formatDuration(duration) {
  const parts = [];
  if (duration.years) parts.push(`${duration.years} leto${duration.years > 1 ? 's' : ''}`);
  if (duration.months) parts.push(`${duration.months} mesec${duration.months > 1 ? 's' : ''}`);
  if (duration.days) parts.push(`${duration.days} dan${duration.days > 1 ? 's' : ''}`);
  if (duration.hours) parts.push(`${duration.hours} ura${duration.hours > 1 ? 's' : ''}`);
  if (duration.minutes) parts.push(`${duration.minutes} minuta${duration.minutes > 1 ? 's' : ''}`);
  if (duration.seconds) parts.push(`${duration.seconds} sekunda${duration.seconds > 1 ? 's' : ''}`);

  return parts.join(', ');
}

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // Output: 1 leto, 2 meseca, 10 dni, 2 uri, 30 minut

Napredna uporaba in premisleki

1. Obravnavanje časovnih pasov

Pri obravnavanju časovnih intervalov, ki prečkajo meje časovnih pasov ali prehode na poletni čas, je ključnega pomena uporaba Temporal.ZonedDateTime za zagotavljanje natančnih izračunov. Z uporabo Temporal.PlainDate in Temporal.PlainTime se boste izognili vsem pretvorbam časovnih pasov.

2. Najmanjša enota in zaokroževanje

Metodi `since()` in `until()` pogosto sprejmeta možnosti za določitev najmanjše enote za nastalo trajanje. Na primer, izračun časa *do* dogodka in omejitev rezultatov na dneve.

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()); //primer izhoda PT340D

3. Prestopne sekunde

Temporal ne upošteva prestopnih sekund izvorno. Če potrebujete izjemno natančnost, boste morali prestopne sekunde obravnavati ločeno.

4. Časovni pasovi IANA

Temporal API se zanaša na bazo podatkov časovnih pasov IANA (Internet Assigned Numbers Authority). Zagotovite, da ima vaše okolje posodobljeno različico baze podatkov IANA za natančno obravnavo pretvorb časovnih pasov.

Najboljše prakse

Pogoste pasti

Primeri uporabe v resničnem svetu v različnih kulturah

Temporal API je lahko še posebej koristen v globalnih aplikacijah, kjer so razlike v časovnih pasovih in kulturne nianse pomembne. Tukaj je nekaj primerov:

Zaključek

Temporal.Duration ponuja robusten in intuitiven način za delo s časovnimi intervali v JavaScriptu. Z razumevanjem njegovih funkcij in najboljših praks lahko samozavestno izvajate natančne in zanesljive izračune trajanja v svojih aplikacijah. Sprejetje Temporal API vodi do čistejše, lažje vzdrževane kode in zmanjšuje tveganje napak, povezanih z zastarelo obravnavo datuma in časa.

Ko se boste poglabljali v Temporal API, se spomnite, da se posvetujete z uradno dokumentacijo in eksperimentirate z različnimi scenariji, da bi v celoti dojeli njegove zmožnosti. S svojo moderno zasnovo in obsežnimi funkcijami bo Temporal revolucioniral način, kako obravnavamo datume, čase in trajanja v JavaScriptu.