Nederlands

Een complete gids voor het gebruik van de Temporal API van JavaScript voor precieze en intuïtieve tijdsintervalberekeningen, van basiscreatie tot geavanceerde rekenkunde en opmaak.

JavaScript Temporal Duration: Tijdsintervalberekeningen Onder de Knie Krijgen

De Temporal API van JavaScript introduceert een moderne en krachtige manier om datums, tijden en tijdsintervallen te beheren. Het Temporal.Duration-object vertegenwoordigt een tijdsduur en biedt een duidelijke en intuïtieve aanpak voor het uitvoeren van berekeningen met tijdsintervallen. Dit artikel duikt in de details van Temporal.Duration en demonstreert hoe u duren kunt creëren, manipuleren en opmaken voor diverse toepassingen.

Wat is Temporal.Duration?

Temporal.Duration vertegenwoordigt een tijdspanne, uitgedrukt in jaren, maanden, dagen, uren, minuten, seconden en fracties van een seconde (milliseconden, microseconden, nanoseconden). In tegenstelling tot Date-objecten, die een specifiek tijdstip vertegenwoordigen, vertegenwoordigt Temporal.Duration een hoeveelheid tijd. Het volgt het ISO 8601-duurformaat (bijv., P1Y2M10DT2H30M staat voor 1 jaar, 2 maanden, 10 dagen, 2 uur en 30 minuten). De Temporal API is ontworpen om intuïtiever en minder foutgevoelig te zijn dan het verouderde Date-object.

Temporal.Duration-objecten Aanmaken

Er zijn verschillende manieren om Temporal.Duration-objecten te creëren:

1. Vanuit een Eenvoudig Object

U kunt een duur creëren door een object met de gewenste eigenschappen door te geven:

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

Dit creëert een duur van 1 jaar, 2 maanden, 10 dagen, 2 uur en 30 minuten. Let op dat de argumenten overeenkomen met de volgende volgorde: years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds.

2. Vanuit een ISO 8601-string

U kunt ook een duur creëren vanuit een ISO 8601-duurstring met Temporal.Duration.from():

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

Dit is vooral handig wanneer u te maken heeft met duren die zijn opgeslagen in stringformaat of afkomstig zijn van een externe bron.

3. Met de add()- en subtract()-methoden bij Temporal.Instant, Temporal.ZonedDateTime, etc.

Wanneer u Temporal.Duration optelt bij of aftrekt van andere Temporal-typen (zoals Temporal.Instant of Temporal.ZonedDateTime), wordt een Temporal.Duration geretourneerd die het verschil tussen de twee tijdstippen vertegenwoordigt als u ze vervolgens van elkaar aftrekt. Bijvoorbeeld:

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

Toegang tot Duurcomponenten

U kunt de individuele componenten van een Temporal.Duration-object benaderen via de eigenschappen ervan:

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

Rekenen met Duren

Temporal.Duration-objecten ondersteunen optellen en aftrekken met de add()- en subtract()-methoden. Deze methoden retourneren een nieuw Temporal.Duration-object dat het resultaat van de bewerking vertegenwoordigt.

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

U kunt deze methoden ook aan elkaar koppelen voor complexere berekeningen:

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

De negated()-methode retourneert een nieuw Temporal.Duration-object waarbij alle componenten een negatieve waarde hebben:

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

De abs()-methode retourneert een nieuw Temporal.Duration-object met alle componenten als positieve waarden (absolute waarden):

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

De with()-methode stelt u in staat om een nieuwe Temporal.Duration-instantie te creëren waarbij sommige, of alle, eigenschappen zijn gewijzigd in nieuwe waarden. Als een waarde niet is gespecificeerd in het argumentobject, wordt de oorspronkelijke waarde van de duur gebruikt. Bijvoorbeeld:

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

Duren Normaliseren

Duren kunnen soms in een niet-genormaliseerde vorm worden uitgedrukt (bijv. P1Y12M, wat vereenvoudigd kan worden tot P2Y). De normalized()-methode probeert een duur te vereenvoudigen tot de meest compacte vorm. Dit vereist echter een referentiedatum om de complexiteit van variërende maandlengtes aan te kunnen. Om correct te normaliseren, heeft u een Temporal.PlainDate-, Temporal.ZonedDateTime- of Temporal.Instant-instantie nodig.

Bijvoorbeeld, het normaliseren van een duur met maanden en dagen vereist een referentiedatum:

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

In dit voorbeeld wordt de duur P1M32D genormaliseerd ten opzichte van 1 januari 2024, wat resulteert in P2M1D omdat januari 31 dagen heeft.

Als u alleen met tijdcomponenten (uren, minuten, seconden, etc.) werkt, kunt u normaliseren zonder een referentiedatum:

const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //of laat het relativeTo-argument weg
console.log(normalizedDuration.toString()); // Output: P1DT2H1M

Duren Vergelijken

U kunt duren vergelijken met de compare()-methode. Deze methode retourneert:

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

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

Praktische Voorbeelden

1. De Tijd tot een Gebeurtenis Berekenen

Stel dat u de resterende tijd tot een specifieke gebeurtenis wilt berekenen. Gebruik Temporal.Now.zonedDateTimeISO() om de huidige tijd te krijgen en trek de datum van de gebeurtenis ervan af. Als de datum van de gebeurtenis al is verstreken, zal de uitvoer negatief zijn.

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: bijv., P262DT14H30M (afhankelijk van de huidige datum en tijd)

2. De Duur van Projecttaken Bijhouden

In projectmanagement kunt u Temporal.Duration gebruiken om de geschatte of werkelijke duur van taken bij te houden.

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

const totalEstimatedDuration = task1EstimatedDuration.add(task2EstimatedDuration);
console.log(`Totale geschatte duur: ${totalEstimatedDuration.toString()}`); // Output: Totale geschatte duur: P1DT

3. Leeftijd Berekenen

Hoewel het nauwkeurig berekenen van leeftijd rekening houdt met schrikkeljaren en tijdzones, kan Temporal.Duration een redelijke schatting geven:

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(`Geschatte leeftijd: ${ageDuration.years} jaar`); // Output: Geschatte leeftijd: 33 jaar

4. Menselijk Leesbare Duren Weergeven

Vaak moet u duren in een menselijk leesbaar formaat weergeven. Hoewel Temporal.Duration geen ingebouwde opmaakfuncties heeft, kunt u aangepaste opmaaklogica creëren:

function formatDuration(duration) {
  const parts = [];
  if (duration.years) parts.push(`${duration.years} ${duration.years > 1 ? 'jaren' : 'jaar'}`);
  if (duration.months) parts.push(`${duration.months} ${duration.months > 1 ? 'maanden' : 'maand'}`);
  if (duration.days) parts.push(`${duration.days} ${duration.days > 1 ? 'dagen' : 'dag'}`);
  if (duration.hours) parts.push(`${duration.hours} uur`);
  if (duration.minutes) parts.push(`${duration.minutes} ${duration.minutes > 1 ? 'minuten' : 'minuut'}`);
  if (duration.seconds) parts.push(`${duration.seconds} ${duration.seconds > 1 ? 'seconden' : 'seconde'}`);

  return parts.join(', ');
}

const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // Output: 1 jaar, 2 maanden, 10 dagen, 2 uur, 30 minuten

Geavanceerd Gebruik en Overwegingen

1. Omgaan met Tijdzones

Wanneer u te maken heeft met tijdsintervallen die tijdzonegrenzen of overgangen van zomertijd overschrijden, is het cruciaal om Temporal.ZonedDateTime te gebruiken om nauwkeurige berekeningen te garanderen. Het gebruik van Temporal.PlainDate en Temporal.PlainTime vermijdt tijdzoneconversies.

2. Kleinste Eenheid en Afronding

De since()- en until()-methoden accepteren vaak opties om de kleinste eenheid voor de resulterende duur te definiëren. Bijvoorbeeld, het berekenen van de tijd *tot* een gebeurtenis en de resultaten beperken tot dagen.

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

3. Schrikkelseconden

Temporal houdt standaard geen rekening met schrikkelseconden. Als u extreme precisie nodig heeft, moet u schrikkelseconden afzonderlijk behandelen.

4. IANA-tijdzones

De Temporal API is afhankelijk van de IANA (Internet Assigned Numbers Authority) tijdzonedatabase. Zorg ervoor dat uw omgeving een up-to-date versie van de IANA-database heeft om tijdzoneconversies nauwkeurig te kunnen afhandelen.

Best Practices

Veelvoorkomende Valkuilen

Praktijkvoorbeelden in Verschillende Culturen

De Temporal API kan bijzonder nuttig zijn in wereldwijde toepassingen waar tijdzoneverschillen en culturele nuances significant zijn. Hier zijn enkele voorbeelden:

Conclusie

Temporal.Duration biedt een robuuste en intuïtieve manier om met tijdsintervallen in JavaScript te werken. Door de functies en best practices te begrijpen, kunt u vol vertrouwen nauwkeurige en betrouwbare duur-berekeningen in uw applicaties uitvoeren. Het omarmen van de Temporal API leidt tot schonere, beter onderhoudbare code en vermindert het risico op fouten die geassocieerd worden met de verouderde manier van datum- en tijdverwerking.

Naarmate u dieper in de Temporal API duikt, vergeet dan niet de officiële documentatie te raadplegen en te experimenteren met verschillende scenario's om de mogelijkheden volledig te begrijpen. Met zijn moderne ontwerp en uitgebreide functies staat Temporal op het punt de manier waarop we omgaan met datums, tijden en duren in JavaScript te revolutioneren.