Suomi

Kattava opas JavaScriptin Temporal API:n käyttöön tarkoissa ja intuitiivisissa aikavälilaskelmissa, kattaen kaiken peruskeston luomisesta edistyneeseen aritmetiikkaan ja muotoiluun.

JavaScript Temporal.Duration: Aikavälilaskelmien hallinta

JavaScriptin Temporal API esittelee modernin ja tehokkaan tavan käsitellä päivämääriä, aikoja ja aikavälejä. Temporal.Duration-olio edustaa ajan pituutta ja tarjoaa selkeän ja intuitiivisen lähestymistavan aikaväleillä tehtäviin laskutoimituksiin. Tämä artikkeli syventyy Temporal.Duration-olion yksityiskohtiin ja näyttää, miten kestoja luodaan, käsitellään ja muotoillaan erilaisiin käyttötapauksiin.

Mikä on Temporal.Duration?

Temporal.Duration edustaa aikajaksoa ilmaisten sen vuosina, kuukausina, päivinä, tunteina, minuutteina, sekunteina ja sekunnin murto-osina (millisekunnit, mikrosekunnit, nanosekunnit). Toisin kuin Date-oliot, jotka edustavat tiettyä ajan hetkeä, Temporal.Duration edustaa ajan määrää. Se noudattaa ISO 8601 -kestomuotoa (esim. P1Y2M10DT2H30M edustaa 1 vuotta, 2 kuukautta, 10 päivää, 2 tuntia ja 30 minuuttia). Temporal API on suunniteltu olemaan intuitiivisempi ja vähemmän virhealtis kuin vanha Date-olio.

Temporal.Duration-olioiden luominen

On olemassa useita tapoja luoda Temporal.Duration-olioita:

1. Tavallisesta oliosta

Voit luoda keston antamalla sille olion, jossa on halutut ominaisuudet:

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

Tämä luo keston, joka on 1 vuosi, 2 kuukautta, 10 päivää, 2 tuntia ja 30 minuuttia. Huomaa, että argumentit vastaavat seuraavaa järjestystä: years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds.

2. ISO 8601 -merkkijonosta

Voit myös luoda keston ISO 8601 -kestomerkkijonosta käyttämällä Temporal.Duration.from()-metodia:

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

Tämä on erityisen hyödyllistä, kun käsitellään merkkijonomuodossa tallennettuja tai ulkoisesta lähteestä saatuja kestoja.

3. Käyttämällä add()- ja subtract()-metodeja Temporal.Instantin, Temporal.ZonedDateTimen jne. kanssa

Kun lisäät tai vähennät Temporal.Duration-olion muista Temporal-tyypeistä (kuten Temporal.Instant tai Temporal.ZonedDateTime), saat tulokseksi Temporal.Duration-olion, joka edustaa kahden ajanhetken eroa, jos sitten vähennät ne toisistaan. Esimerkiksi:

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

Keston osien käyttäminen

Voit käyttää Temporal.Duration-olion yksittäisiä osia sen ominaisuuksien kautta:

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

Aritmeettiset laskutoimitukset kestoilla

Temporal.Duration-oliot tukevat yhteen- ja vähennyslaskua add()- ja subtract()-metodien avulla. Nämä metodit palauttavat uuden Temporal.Duration-olion, joka edustaa operaation tulosta.

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

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

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

Voit myös ketjuttaa näitä metodeja monimutkaisempia laskelmia varten:

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

negated()-metodi palauttaa uuden Temporal.Duration-olion, jossa kaikki komponentit ovat negatiivisia:

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

abs()-metodi palauttaa uuden Temporal.Duration-olion, jossa kaikki komponentit ovat positiivisia arvoja (itseisarvoja):

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

with()-metodin avulla voit luoda uuden Temporal.Duration-instanssin, jossa osa tai kaikki ominaisuudet on muutettu uusiksi arvoiksi. Jos arvoa ei ole määritelty argumenttioliossa, käytetään keston alkuperäistä arvoa. Esimerkiksi:

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

Kestojen normalisointi

Kestot voidaan joskus ilmaista normalisoimattomassa muodossa (esim. P1Y12M, joka voitaisiin yksinkertaistaa muotoon P2Y). normalized()-metodi yrittää yksinkertaistaa keston sen tiiveimpään muotoon. Se vaatii kuitenkin viitepäivämäärän kuukausien vaihtelevien pituuksien monimutkaisuuden käsittelemiseksi. Oikean normalisoinnin suorittamiseksi tarvitset Temporal.PlainDate-, Temporal.ZonedDateTime- tai Temporal.Instant-instanssin.

Esimerkiksi kuukausia ja päiviä sisältävän keston normalisointi vaatii viitepäivämäärän:

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

Tässä esimerkissä kesto P1M32D normalisoidaan suhteessa 1. tammikuuta 2024, mikä johtaa tulokseen P2M1D, koska tammikuussa on 31 päivää.

Jos käsittelet vain aikakomponentteja (tunnit, minuutit, sekunnit jne.), voit normalisoida ilman viitepäivämäärää:

const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //tai jätä relativeTo-argumentti pois
console.log(normalizedDuration.toString()); // Tuloste: P1DT2H1M

Kestojen vertailu

Voit verrata kestoja compare()-metodilla. Tämä metodi palauttaa:

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

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

Käytännön esimerkkejä

1. Tapahtumaan jäljellä olevan ajan laskeminen

Oletetaan, että haluat laskea tiettyyn tapahtumaan jäljellä olevan ajan. Käytä Temporal.Now.zonedDateTimeISO() saadaksesi nykyisen ajan ja vähennä se tapahtuman päivämäärästä. Jos tapahtuman päivämäärä on mennyt ohi, tuloste on negatiivinen.

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()); // Tuloste: esim. P262DT14H30M (riippuen nykyisestä päivämäärästä ja ajasta)

2. Projektitehtävien kestojen seuranta

Projektinhallinnassa voit käyttää Temporal.Duration-oliota tehtävien arvioitujen tai todellisten kestojen seuraamiseen.

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

const totalEstimatedDuration = task1EstimatedDuration.add(task2EstimatedDuration);
console.log(`Arvioitu kokonaiskesto: ${totalEstimatedDuration.toString()}`); // Tuloste: Arvioitu kokonaiskesto: P1DT

3. Iän laskeminen

Vaikka iän tarkka laskeminen vaatii karkausvuosien ja aikavyöhykkeiden huomioon ottamista, Temporal.Duration voi antaa kohtuullisen arvion:

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(`Arvioitu ikä: ${ageDuration.years} vuotta`); // Tuloste: Arvioitu ikä: 33 vuotta

4. Ihmisluettavien kestojen näyttäminen

Usein kestoja täytyy näyttää ihmisluettavassa muodossa. Vaikka Temporal.Duration-oliolla ei ole sisäänrakennettuja muotoilufunktioita, voit luoda mukautettua muotoilulogiikkaa:

function formatDuration(duration) {
  const parts = [];
  if (duration.years) parts.push(`${duration.years} vuosi${duration.years > 1 ? 'a' : ''}`);
  if (duration.months) parts.push(`${duration.months} kuukausi${duration.months > 1 ? 'a' : ''}`);
  if (duration.days) parts.push(`${duration.days} päivä${duration.days > 1 ? 'ä' : ''}`);
  if (duration.hours) parts.push(`${duration.hours} tunti${duration.hours > 1 ? 'a' : ''}`);
  if (duration.minutes) parts.push(`${duration.minutes} minuutti${duration.minutes > 1 ? 'a' : ''}`);
  if (duration.seconds) parts.push(`${duration.seconds} sekunti${duration.seconds > 1 ? 'a' : ''}`);

  return parts.join(', ');
}

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // Tuloste: 1 vuosi, 2 kuukautta, 10 päivää, 2 tuntia, 30 minuuttia

Edistynyt käyttö ja huomioitavat seikat

1. Aikavyöhykkeiden käsittely

Kun käsitellään aikavälejä, jotka ylittävät aikavyöhykerajoja tai kesäaikasiirtymiä, on ratkaisevan tärkeää käyttää Temporal.ZonedDateTime-oliota tarkkojen laskelmien varmistamiseksi. Temporal.PlainDate- ja Temporal.PlainTime-olioiden käyttö välttää aikavyöhykemuunnokset.

2. Pienin yksikkö ja pyöristys

since()- ja until()-metodit hyväksyvät usein asetuksia, joilla määritellään tuloksena olevan keston pienin yksikkö. Esimerkiksi laskettaessa aikaa tapahtumaan *asti* ja rajoittamalla tulokset päiviin.

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

3. Karkaussekunnit

Temporal ei ota karkaussekunteja huomioon natiivisti. Jos tarvitset äärimmäistä tarkkuutta, sinun on käsiteltävä karkaussekunnit erikseen.

4. IANA-aikavyöhykkeet

Temporal API perustuu IANA (Internet Assigned Numbers Authority) -aikavyöhyketietokantaan. Varmista, että ympäristössäsi on ajantasainen versio IANA-tietokannasta, jotta aikavyöhykemuunnokset käsitellään oikein.

Parhaat käytännöt

Yleisimmät sudenkuopat

Tosielämän käyttötapauksia eri kulttuureissa

Temporal API voi olla erityisen hyödyllinen globaaleissa sovelluksissa, joissa aikavyöhyke-erot ja kulttuuriset vivahteet ovat merkittäviä. Tässä muutamia esimerkkejä:

Yhteenveto

Temporal.Duration tarjoaa vankan ja intuitiivisen tavan työskennellä aikavälien kanssa JavaScriptissä. Ymmärtämällä sen ominaisuudet ja parhaat käytännöt voit luottavaisesti suorittaa tarkkoja ja luotettavia kestolaskelmia sovelluksissasi. Temporal API:n omaksuminen johtaa puhtaampaan, ylläpidettävämpään koodiin ja vähentää vanhaan päivämäärä- ja aikakäsittelyyn liittyvien virheiden riskiä.

Kun syvennyt Temporal API:in, muista tutustua viralliseen dokumentaatioon ja kokeilla erilaisia skenaarioita ymmärtääksesi sen ominaisuudet täysin. Modernin suunnittelunsa ja kattavien ominaisuuksiensa ansiosta Temporal tulee mullistamaan tavan, jolla käsittelemme päivämääriä, aikoja ja kestoja JavaScriptissä.