Podrobný sprievodca JavaScript Temporal API, moderným riešením pre efektívne spracovanie dátumov a časov v rôznych medzinárodných kontextoch.
JavaScript Temporal API: Moderné spracovanie dátumu a času pre globálne publikum
Objekt `Date` v JavaScripte bol dlho zdrojom frustrácie pre vývojárov. Jeho meniteľnosť, nekonzistentné API a slabá podpora časových pásiem viedli k vzniku mnohých knižníc ako Moment.js a date-fns, ktoré tieto medzery vypĺňali. Teraz, s Temporal API, JavaScript ponúka moderné, vstavané riešenie pre spracovanie dátumov a časov s vylepšenou prehľadnosťou a presnosťou. Tento článok poskytuje komplexný prehľad Temporal API so zameraním na jeho funkcie, výhody a použitie v rôznych medzinárodných kontextoch.
Čo je Temporal API?
Temporal API je nový, globálny objekt v JavaScripte navrhnutý tak, aby riešil nedostatky objektu `Date`. Poskytuje čisté, nemenné API pre prácu s dátumami, časmi, časovými pásmami a kalendárnymi systémami. Kľúčové je, že sa snaží reprezentovať koncepty dátumu a času spôsobom, ktorý je bližší reálnemu používaniu a očakávaniam, čo výrazne zjednodušuje internacionalizáciu.
Kľúčové vlastnosti:
- Nemennosť: Objekty Temporal sú nemenné, čo znamená, že operácie ako pridávanie dní alebo mesiacov vracajú nové objekty namiesto modifikácie pôvodného. Tým sa eliminuje bežný zdroj chýb a kód sa stáva ľahšie pochopiteľným.
- Prehľadné API: Temporal poskytuje konzistentné a intuitívne API pre bežné operácie s dátumom a časom.
- Podpora časových pásiem: Temporal zahŕňa robustnú podporu pre časové pásma, čo umožňuje prácu s dátumami a časmi na rôznych miestach bez zložitostí starého objektu `Date`. Využíva databázu časových pásiem IANA, čím zaručuje presné a aktuálne informácie.
- Kalendárne systémy: Okrem gregoriánskeho kalendára podporuje Temporal aj alternatívne kalendárne systémy, čím vychádza v ústrety potrebám rôznych kultúr a regiónov.
- Vylepšená presnosť: Temporal ponúka nanosekundovú presnosť, čím rieši obmedzenia objektu `Date` založeného na milisekundách.
Základné objekty Temporal
Temporal API predstavuje niekoľko nových typov objektov. Tu sú niektoré z tých hlavných:
- `Temporal.PlainDate`: Reprezentuje dátum (rok, mesiac, deň) bez časového pásma.
- `Temporal.PlainTime`: Reprezentuje čas (hodina, minúta, sekunda, milisekunda, mikrosekunda, nanosekunda) bez dátumu alebo časového pásma.
- `Temporal.PlainDateTime`: Reprezentuje dátum a čas bez časového pásma.
- `Temporal.ZonedDateTime`: Reprezentuje dátum a čas s konkrétnym časovým pásmom.
- `Temporal.Instant`: Reprezentuje špecifický okamih v čase, meraný v nanosekundách od Unix epochy (1. januára 1970 UTC).
- `Temporal.TimeZone`: Reprezentuje časové pásmo.
- `Temporal.Duration`: Reprezentuje časový úsek (napr. 2 hodiny, 30 minút).
- `Temporal.YearMonth`: Reprezentuje rok a mesiac.
- `Temporal.MonthDay`: Reprezentuje mesiac a deň.
Práca s dátumami
Vytvorenie `Temporal.PlainDate`
Na vytvorenie `Temporal.PlainDate` môžete použiť konštruktor:
const plainDate = new Temporal.PlainDate(2024, 10, 27); // Rok, Mesiac (1-12), Deň
console.log(plainDate.toString()); // Výstup: 2024-10-27
Môžete tiež použiť metódu `from`, ktorá prijíma reťazec vo formáte ISO 8601:
const plainDateFromString = Temporal.PlainDate.from('2024-10-27');
console.log(plainDateFromString.toString()); // Výstup: 2024-10-27
Získanie zložiek dátumu
K jednotlivým zložkám dátumu môžete pristupovať pomocou vlastností ako `year`, `month` a `day`:
console.log(plainDate.year); // Výstup: 2024
console.log(plainDate.month); // Výstup: 10
console.log(plainDate.day); // Výstup: 27
Aritmetika s dátumami
Na pridanie alebo odčítanie dní, týždňov, mesiacov alebo rokov použite metódy `plus` a `minus`. Tieto metódy vracajú nový objekt `Temporal.PlainDate`:
const nextWeek = plainDate.plus({ days: 7 });
console.log(nextWeek.toString()); // Výstup: 2024-11-03
const lastMonth = plainDate.minus({ months: 1 });
console.log(lastMonth.toString()); // Výstup: 2024-09-27
Porovnávanie dátumov
Dátumy môžete porovnávať pomocou metódy `compare`:
const date1 = new Temporal.PlainDate(2024, 10, 27);
const date2 = new Temporal.PlainDate(2024, 11, 15);
console.log(Temporal.PlainDate.compare(date1, date2)); // Výstup: -1 (date1 je skôr ako date2)
Práca s časmi
Vytvorenie `Temporal.PlainTime`
Na vytvorenie `Temporal.PlainTime` použite konštruktor:
const plainTime = new Temporal.PlainTime(10, 30, 0); // Hodina, Minúta, Sekunda
console.log(plainTime.toString()); // Výstup: 10:30:00
Alebo použite metódu `from` s časovým reťazcom ISO 8601:
const plainTimeFromString = Temporal.PlainTime.from('10:30:00');
console.log(plainTimeFromString.toString()); // Výstup: 10:30:00
Získanie zložiek času
console.log(plainTime.hour); // Výstup: 10
console.log(plainTime.minute); // Výstup: 30
console.log(plainTime.second); // Výstup: 0
Aritmetika s časom
const later = plainTime.plus({ minutes: 15 });
console.log(later.toString()); // Výstup: 10:45:00
Spoločná práca s dátumom a časom
Vytvorenie `Temporal.PlainDateTime`
Môžete vytvoriť `Temporal.PlainDateTime` priamo alebo kombináciou `Temporal.PlainDate` a `Temporal.PlainTime`:
const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
console.log(plainDateTime.toString()); // Výstup: 2024-10-27T10:30:00
const date = new Temporal.PlainDate(2024, 10, 27);
const time = new Temporal.PlainTime(10, 30, 0);
const combinedDateTime = date.toPlainDateTime(time);
console.log(combinedDateTime.toString()); // Výstup: 2024-10-27T10:30:00
Časové pásma
Správne zaobchádzanie s časovými pásmami je kľúčové pre aplikácie, ktoré pracujú s používateľmi na rôznych miestach. Temporal API poskytuje robustnú podporu časových pásiem prostredníctvom objektov `Temporal.ZonedDateTime` a `Temporal.TimeZone`.
Vytvorenie `Temporal.ZonedDateTime`
Na vytvorenie `Temporal.ZonedDateTime` potrebujete `Temporal.PlainDateTime` a identifikátor časového pásma. Identifikátory časových pásiem sú založené na databáze časových pásiem IANA (napr. `America/Los_Angeles`, `Europe/London`, `Asia/Tokyo`).
const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);
console.log(zonedDateTime.toString()); // Výstup: 2024-10-27T10:30:00-07:00[America/Los_Angeles] (Odchýlka bude závisieť od pravidiel letného času)
Alternatívne, vytvorte `Temporal.ZonedDateTime` z objektu `Instant`.
const instant = Temporal.Instant.fromEpochSeconds(1666866600); // Príklad časovej pečiatky
const zonedDateTimeFromInstant = instant.toZonedDateTimeISO(timeZone); // Časové pásmo ako 'America/Los_Angeles'
console.log(zonedDateTimeFromInstant.toString());
Konverzia medzi časovými pásmami
Môžete konvertovať `Temporal.ZonedDateTime` do iného časového pásma pomocou metódy `withTimeZone`:
const newTimeZone = 'Europe/London';
const zonedDateTimeInLondon = zonedDateTime.withTimeZone(newTimeZone);
console.log(zonedDateTimeInLondon.toString()); // Výstup: 2024-10-27T18:30:00+01:00[Europe/London]
Práca s odchýlkami časových pásiem
Metóda `getOffsetStringFor` objektu `Temporal.TimeZone` poskytuje reťazec odchýlky pre daný `Temporal.Instant`:
const timeZoneObject = new Temporal.TimeZone(timeZone);
const offsetString = timeZoneObject.getOffsetStringFor(zonedDateTime.toInstant());
console.log(offsetString); // Výstup: -07:00 (V závislosti od pravidiel letného času)
Pre presné výpočty je nevyhnutné používať správne identifikátory časových pásiem IANA. Tieto identifikátory sú pravidelne udržiavané a aktualizované, aby odrážali zmeny v letnom čase a hraniciach časových pásiem.
Trvanie (Durations)
Objekt `Temporal.Duration` reprezentuje časový úsek. Môže byť použitý na pripočítanie alebo odpočítanie od dátumov a časov.
Vytvorenie `Temporal.Duration`
Môžete vytvoriť `Temporal.Duration` pomocou konštruktora, kde špecifikujete roky, mesiace, dni, hodiny, minúty, sekundy, milisekundy, mikrosekundy a nanosekundy:
const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9); // Roky, Mesiace, Dni, Hodiny, Minúty, Sekundy, Milisekundy, Mikrosekundy, Nanosekundy
console.log(duration.toString()); // Výstup: P1Y2M3DT4H5M6.007008009S
Alebo použitím reťazca trvania ISO 8601:
const durationFromString = Temporal.Duration.from('P1Y2M3DT4H5M6S');
console.log(durationFromString.toString()); // Výstup: P1Y2M3DT4H5M6S
Pridávanie trvania k dátumom a časom
const plainDate = new Temporal.PlainDate(2024, 10, 27);
const duration = new Temporal.Duration(0, 0, 7); // 7 dní
const newDate = plainDate.plus(duration);
console.log(newDate.toString()); // Výstup: 2024-11-03
Všimnite si, že pridávanie trvaní, ktoré zahŕňajú mesiace alebo roky, k dátumom vyžaduje opatrnosť, pretože počet dní v mesiaci alebo roku sa môže líšiť.
Kalendárne systémy
Temporal API podporuje rôzne kalendárne systémy okrem gregoriánskeho kalendára. To je kľúčové pre aplikácie, ktoré potrebujú spracovávať dátumy v rôznych kultúrnych kontextoch. Hoci podpora sa stále vyvíja, poskytuje základ pre budúce rozšírenie.
Používanie alternatívnych kalendárov
Ak chcete použiť špecifický kalendár, môžete ho špecifikovať pri vytváraní objektov Temporal:
const hebrewDate = new Temporal.PlainDate(5785, 1, 1, { calendar: 'hebrew' });
console.log(hebrewDate.toString()); // Špecifický výstup sa môže líšiť v závislosti od implementácie a formátovania. V čase písania tohto článku vyžaduje v mnohých prostrediach polyfill.
Dôležité: Podpora pre negregoriánske kalendáre môže vyžadovať polyfilly alebo špecifickú podporu prehliadača/prostredia. Skontrolujte najnovšie informácie v dokumentácii Temporal API a v tabuľkách kompatibility prehliadačov.
Formátovanie dátumov a časov
Zatiaľ čo sa Temporal API zameriava na manipuláciu s dátumom a časom, formátovanie je zvyčajne riešené objektom `Intl.DateTimeFormat`, ktorý je súčasťou Internationalization API. Objekty Temporal bezproblémovo spolupracujú s `Intl.DateTimeFormat`.
Použitie `Intl.DateTimeFormat`
Takto sa formátuje `Temporal.PlainDate` pomocou `Intl.DateTimeFormat`:
const plainDate = new Temporal.PlainDate(2024, 10, 27);
const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatter.format(plainDate)); // Výstup: October 27, 2024
const formatterGerman = new Intl.DateTimeFormat('de-DE', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatterGerman.format(plainDate)); // Výstup: 27. Oktober 2024
Možnosti formátovania si môžete prispôsobiť podľa svojich potrieb. Prvý argument pre `Intl.DateTimeFormat` je lokalita (locale), ktorá určuje jazyk a regionálne konvencie použité na formátovanie. Použitie rôznych lokalít (napr. 'en-US', 'de-DE', 'fr-FR', 'ja-JP') vytvára rôzne výstupné formáty.
Formátovanie `Temporal.ZonedDateTime`
Formátovanie `Temporal.ZonedDateTime` je podobné, ale do výstupu môžete zahrnúť aj informácie o časovom pásme:
const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);
const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', timeZoneName: 'short' });
console.log(formatter.format(zonedDateTime)); // Výstup: October 27, 2024, 10:30 AM PDT (Skratka časového pásma závisí od pravidiel letného času)
Osvedčené postupy pre internacionalizáciu
Pri práci s dátumami a časmi v globálnom kontexte majte na pamäti nasledujúce osvedčené postupy:
- Používajte identifikátory časových pásiem IANA: Pre presné spracovanie časových pásiem vždy používajte identifikátory IANA (napr. `America/Los_Angeles`, `Europe/London`).
- Dávajte pozor na letný čas: Letný čas (DST) môže ovplyvniť odchýlky časových pásiem. Temporal API automaticky spracováva prechody na letný čas.
- Používajte `Intl.DateTimeFormat` na formátovanie: Na formátovanie dátumov a časov podľa lokality používateľa použite objekt `Intl.DateTimeFormat`.
- Zvážte kalendárne systémy: Ak vaša aplikácia potrebuje podporovať používateľov v rôznych kultúrnych kontextoch, zvážte použitie alternatívnych kalendárnych systémov.
- Ukladajte dátumy a časy v UTC: Pri ukladaní dátumov a časov do databázy je osvedčeným postupom ukladať ich v UTC (Koordinovaný svetový čas), aby sa predišlo problémom s časovými pásmami. Následne ich pre účely zobrazenia konvertujte na lokálny čas. Temporal poskytuje metódy na konverziu do a z UTC.
- Dôkladne testujte: Testujte svoju aplikáciu s rôznymi časovými pásmami, lokalitami a kalendárnymi systémami, aby ste sa uistili, že funguje správne pre všetkých používateľov.
Porovnanie Temporal API so starým objektom Date
Tu je tabuľka, ktorá zdôrazňuje kľúčové rozdiely a výhody Temporal API v porovnaní so starým objektom `Date`:
Vlastnosť | Starý objekt `Date` | Temporal API |
---|---|---|
Meniteľnosť | Meniteľný (modifikuje pôvodný objekt) | Nemenný (vracia nové objekty) |
Podpora časových pásiem | Obmedzená a často problematická | Robustná a presná, založená na databáze časových pásiem IANA |
API | Nekonzistentné a ťažko použiteľné | Prehľadné, konzistentné a intuitívne |
Presnosť | Milisekunda | Nanosekunda |
Kalendárne systémy | Obmedzené na gregoriánsky | Podporuje alternatívne kalendárne systémy (s vyvíjajúcou sa podporou) |
Internacionalizácia | Vyžaduje externé knižnice pre robustnú internacionalizáciu | Vstavaná podpora a bezproblémová integrácia s `Intl.DateTimeFormat` |
Podpora v prehliadačoch a Polyfilly
Keďže ide o relatívne nové API, podpora Temporal API v prehliadačoch sa stále vyvíja. Skontrolujte najnovšie tabuľky kompatibility prehliadačov (napr. na MDN Web Docs), aby ste zistili, ktoré prehliadače a prostredia ho podporujú natívne. Pre staršie prehliadače alebo prostredia bez natívnej podpory môžete použiť polyfilly na poskytnutie funkcionality Temporal API. Na webe vyhľadajte „Temporal API polyfill“, aby ste našli vhodné možnosti.
Záver
JavaScript Temporal API predstavuje významný krok vpred v spracovaní dátumov a časov v JavaScripte. Jeho nemennosť, prehľadné API, robustná podpora časových pásiem a možnosti kalendárnych systémov z neho robia mocný nástroj pre vývojárov, ktorí vytvárajú aplikácie, ktoré potrebujú pracovať s dátumami a časmi presne a spoľahlivo v rôznych medzinárodných kontextoch. Hoci podpora v prehliadačoch sa stále vyvíja, výhody Temporal API ho robia hodným učenia a osvojenia pre nové projekty. Prijatím Temporal API a dodržiavaním osvedčených postupov pre internacionalizáciu môžete vytvárať aplikácie, ktoré poskytujú bezproblémový a presný zážitok s dátumom a časom pre používateľov po celom svete.