JavaScript-də yazılmış demək olar ki, hər hansı bir proqram müəyyən dərəcədə vaxt və ya tarixlərlə işləyir. Başlanğıcda bu, daxili Date API ilə məhdudlaşırdı. Bu API əsas funksionallığı ehtiva edir, lakin edə biləcəkləri baxımından olduqca məhduddur. Moment.js kimi üçüncü tərəf kitabxanaları və daha sonra Intl API və yeni Temporal API kimi daxili API-lər vaxt və tarixlərlə işləmək üçün daha çox çeviklik əlavə edir. Anın Yüksəlişi və Düşüşü.js Moment.js vaxt və tarixlərlə işləmək üçün güclü köməkçi proqramları olan JavaScript kitabxanasıdır. O, vaxt zonasının manipulyasiyası kimi əsas Date API-dən çatışmayan funksiyaları ehtiva edir və bir çox ümumi əməliyyatları sadələşdirir. Moment həmçinin tarixləri və vaxtları formatlamaq üçün funksiyaları ehtiva edir. Bir çox müxtəlif tətbiqlərdə geniş istifadə olunan bir kitabxanaya çevrildi. Bununla belə, Moment-in də öz problemləri var idi. Bu, böyük bir kitabxanadır və proqram paketinin ölçüsünü əhəmiyyətli dərəcədə artıra bilər. Kitabxana ağacın silkələnməsini dəstəkləmədiyi üçün (kitabxanaların istifadə olunmamış hissələrini silə bilən müasir paketləyicilərin xüsusiyyəti), onun yalnız bir və ya iki funksiyasından istifadə etsəniz belə, bütün Moment kitabxanası daxil edilir. Momentlə bağlı başqa bir problem onun yaratdığı obyektlərin dəyişkən olmasıdır. Moment obyektində müəyyən funksiyaların çağırılması yan təsirlərə malikdir və həmin obyektin dəyərini mutasiya edir. Bu, gözlənilməz davranışa və ya səhvlərə səbəb ola bilər. 2020-ci ildə Moment-in baxıcıları kitabxananı texniki xidmət rejiminə keçirməyə qərar verdilər. Heç bir yeni xüsusiyyət inkişafı aparılmır və baxıcılar onu yeni layihələr üçün istifadə etməyi tövsiyə edirlər. Tarix-fns kimi başqa JavaScript tarix kitabxanaları var, lakin şəhərdə yeni oyunçu var, birbaşa JavaScript-də qurulmuş API: Temporal. Bu, orijinal Date API-nin boşluqlarını dolduran, həmçinin Moment və digər kitabxanalarda olan bəzi məhdudiyyətləri həll edən yeni standartdır. Temporal nədir? Temporal müasir JavaScript-i müəyyən edən ECMAScript standartına əlavə edilən yeni vaxt və tarix API-sidir. 20266-cı ilin mart ayından etibarən o, TC39 prosesinin 4-cü mərhələsinə (JavaScript dilinə təklif və əlavələrə nəzarət edən komitə) çatmışdır və ECMAScript spesifikasiyasının növbəti versiyasına daxil ediləcək. O, artıq bir neçə brauzerdə tətbiq edilib: Chrome 144+ və Firefox 139+, Safari-nin tezliklə izlənəcəyi gözlənilir. Dəstəklənməyən brauzerlər və Node.js üçün çoxlu doldurma da mövcuddur. Temporal API, ümumiyyətlə, zamanın anlarını təmsil edən obyektlər yaradır. Bunlar müəyyən bir saat qurşağında tam vaxt və tarix ştampları ola bilər və ya hər hansı bir saat qurşağı və ya tarix məlumatı olmadan “divar saatı” vaxtının ümumi nümunəsi ola bilər. Temporalın əsas xüsusiyyətlərindən bəziləri bunlardır:
Tarixi olan və ya olmayan vaxtlar. Müvəqqəti obyekt müəyyən bir tarixdə xüsusi vaxtı və ya heç bir tarix məlumatı olmayan vaxtı təmsil edə bilər. Vaxtı olmayan müəyyən bir tarix də göstərilə bilər. Saat qurşağı dəstəyi. Müvəqqəti obyektlər tam saat qurşağından xəbərdardır və müxtəlif vaxt qurşaqları arasında çevrilə bilər. Moment də vaxt qurşaqlarını dəstəkləyir, lakin əlavə an saat qurşağı kitabxanasını tələb edir. Dəyişməzlik. Müvəqqəti obyekt yaradıldıqdan sonra onu dəyişdirmək olmaz. Saat arifmetik və ya saat qurşağı çevrilmələri əsas obyekti dəyişdirmir. Bunun əvəzinə onlar yeni Müvəqqəti obyekt yaradırlar. 1-əsaslı indeksləşdirmə. Date API (həmçinin Moment ilə) ilə bağlı ümumi səhv mənbəyi ayların sıfır indeksli olmasıdır. Bu o deməkdir ki, real həyatda hamımızın başa düşdüyü kimi yanvar 1 ay deyil, 0 aydır. Müvəqqəti bunu 1 əsaslı indeksləşdirmədən istifadə edərək düzəldir - yanvar 1 aydır. O, brauzerdə quraşdırılıb. Temporal brauzerin özündə API olduğundan, tətbiqinizin paket ölçüsünə heç nə əlavə etmir.
Date API-nin getmədiyini də qeyd etmək vacibdir. Temporal bu API-ni əvəz etsə də, o, silinmir və ya köhnəlmir. Brauzerlər birdən Date API-ni silsələr, bir çox proqram pozulacaq. Bununla belə, unutmayın ki, Moment indi texniki xidmət rejimində köhnə layihə hesab olunur. Məqalənin qalan hissəsində Moment əsaslı kodu yeni Temporal API-yə köçürmək üçün bəzi "reseptlərə" baxacağıq. Yenidən işləməyə başlayaq! Tarix və Saat Obyektlərinin Yaradılması Tarixləri və vaxtı manipulyasiya etməzdən əvvəl onları təmsil edən obyektlər yaratmalıyıq. Cari tarix və vaxtı təmsil edən Moment obyekti yaratmaq üçün an funksiyasından istifadə edin. const now = moment(); console.log(indi); // An<2026-02-18T21:26:29-05:00>
Bu obyekt indi lazım olduqda formatlaşdırıla və ya manipulyasiya edilə bilər.
// UTC-yə çevirin //xəbərdarlıq: Bu Moment obyektini mutasiya edir və onu UTC rejiminə qoyur! console.log(now.utc()); // Moment<2026-02-19T02:26:29Z>
// formatlanmış sətri çap edin - indi UTC vaxtından istifadə etdiyini nəzərə alın console.log(indi.format('AA/GG/YYYY ss:dd:ss a')); // 19.02.2026, 02:27:07
Moment haqqında yadda saxlamaq lazım olan əsas şey odur ki, Moment obyekti həmişə vaxt və tarix haqqında məlumat ehtiva edir. Yalnız vaxt məlumatı ilə işləmək lazımdırsa, bu, adətən yaxşıdır, lakin bu, Yay işığına qənaət vaxtı və ya sıçrayış illəri kimi vəziyyətlərdə gözlənilməz davranışa səbəb ola bilər, burada tarix vaxt hesablamalarına təsir edə bilər. Temporal daha çevikdir. Temporal.Instant obyekti yaratmaqla cari tarix və vaxtı təmsil edən obyekt yarada bilərsiniz. Bu, “dövr”dən (1970-ci il yanvarın 1-də gecə yarısı UTC) keçən zamanla müəyyən edilmiş vaxt nöqtəsini təmsil edir. Temporal nanosaniyə səviyyəli dəqiqliklə bu anı vaxtında istinad edə bilər. const now = Temporal.Now.instant();
// epoxadan bəri xam nanosaniyələrə baxın console.log(indi.epochNanoseconds); // 1771466342612000000n
// UTC üçün format console.log(indi.toString()); // 2026-02-19T01:55:27.844Z
// müəyyən vaxt qurşağı üçün format console.log(now.toString({zaman qurşağı: 'Amerika/New_York' })); // 2026-02-18T20:56:57.905-05:00
Temporal.Instant obyektləri həmçinin from statik metodundan istifadə etməklə müəyyən vaxt və tarix üçün yaradıla bilər.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Yerli saat qurşağında ani formatlayın. Qeyd edək ki, bu yalnız nəzarət edir // formatlaşdırma - moment.utc kimi obyekti mutasiya etmir. console.log(myInstant.toString({zaman qurşağı: 'Amerika/New_York' })); // 2026-02-18T21:10:00-05:00
Siz həmçinin digər növ müvəqqəti obyektlər yarada bilərsiniz, o cümlədən:
Temporal.PlainDate: Vaxt məlumatı olmayan tarix. Temporal.PlainTime: Tarix məlumatı olmayan vaxt. Temporal.ZonedDateTime: Müəyyən bir vaxt qurşağında tarix və vaxt.
Bunların hər birində tarix və/yaxud vaxtı təyin edən obyektlə və ya təhlil ediləcək tarix sətri ilə çağırıla bilən bir from metodu var. // Sadəcə bir tarix const today = Temporal.PlainDate.from({ il: 2026, ay: 2, // fevral üçün 2-dən istifadə etdiyimizi qeyd edin gün: 18 }); console.log(bugün.toString()); // 2026-02-18
// Sadəcə bir zaman const lunchTime = Temporal.PlainTime.from({ saat: 12 }); console.log(lunchTime.toString()); // 12:00:00
// ABŞ-ın Şərq saat qurşağında tarix və vaxt const dueAt = Temporal.ZonedDateTime.from({ saat qurşağı: 'Amerika/New_York', il: 2026, ay: 3, gün: 1, saat: 12, dəqiqə: 0, ikinci: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[Amerika/Nyu_York]
Təhlil Biz tarix və vaxt məlumatının proqramlı yaradılmasını əhatə etdik. İndi təhlilə baxaq. Analiz, Momentin daxili Temporal API-dən daha çevik olduğu bir sahədir. Siz tarix sətirini an funksiyasına ötürərək təhlil edə bilərsiniz. Tək bir arqumentlə Moment ISO tarix sətrini gözləyir, lakin istifadə olunan tarix formatını göstərən ikinci arqument təqdim etsəniz, alternativ formatlardan istifadə edə bilərsiniz.
const isoDate = moment('2026-02-21T09:00:00'); const formattedDate = moment('21/26 9:00:00', 'A/G/YY h:dd:ss');
console.log(isoDate); // An<2026-02-21T09:00:00-05:00>
console.log(format tarixi); // An<2026-02-21T09:00:00-05:00>
Köhnə versiyalarda Moment istənilən ixtiyari formatlaşdırılmış tarix sətirini təhlil etmək üçün ən yaxşı təxmin edərdi. Bu, gözlənilməz nəticələrə səbəb ola bilər. Məsələn, 02-03-2026 2 fevral yoxsa 3 mart? Bu səbəbdən Moment-in daha yeni versiyaları, ISO formatlı tarix sətri olmadan çağırıldıqda (istənilən formata malik ikinci arqument də verilmədikdə) nəzərə çarpan köhnəlmə xəbərdarlığını göstərir. Temporal yalnız xüsusi formatlaşdırılmış tarix sətirini təhlil edəcək. Sətir ISO 8601 formatına və ya onun genişləndirilməsinə, RFC 9557-yə uyğun olmalıdır. Uyğun olmayan tarix sətri from metoduna ötürülürsə, Temporal RangeError atacaq.
// RFC 9557 tarix sətirindən istifadə const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[Amerika/New_York]'); console.log(myDate.toString({zaman qurşağı: 'Amerika/New_York' })); // 2026-02-21T09:00:00-05:00
// Naməlum tarix sətirindən istifadə const otherDate = Temporal.Instant.from('21/26 9:00:00'); // RangeError: Müvəqqəti xəta: İl dəyərini təhlil edərkən etibarsız simvol.
Tarix sətirinin dəqiq tələbləri hansı növ Müvəqqəti obyekt yaratdığınızdan asılıdır. Yuxarıdakı misalda Temporal.Instant tam ISO tələb edir8601 və ya RFC 9557 tarix sətri, vaxt zonasının ofseti ilə tarix və vaxtı təyin edir, lakin siz həm də tarix formatının yalnız alt çoxluğundan istifadə edərək PlainDate və ya PlainTime obyektlərini yarada bilərsiniz. const myDate = Temporal.PlainDate.from('2026-02-21'); console.log(myDate.toString()); // 2026-02-21
const myTime = Temporal.PlainTime.from('09:00:00'); console.log(myTime.toString()); // 09:00:00
Nəzərə alın ki, bu sətirlər hələ də gözlənilən formata uyğun olmalıdır, əks halda xəta baş verəcək.
// Uyğun olmayan vaxt sətirlərindən istifadə. Bunların hamısı bir RangeError atacaq. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');
İpucu: Qeyri-ISO sətirləri idarə etmək Temporal etibarlılığa üstünlük verdiyi üçün o, 01-02-2026 kimi sətir formatını təxmin etməyə çalışmayacaq. Əgər məlumat mənbəyiniz bu cür sətirlərdən istifadə edirsə, onu Temporal ilə istifadə etməyə cəhd etməzdən əvvəl dəyərləri 2026-02-01 kimi ISO sətirinə çevirmək üçün bəzi sətir manipulyasiyası etməlisiniz.
Formatlama Moment və ya Temporal obyektiniz olduqda, yəqin ki, nə vaxtsa onu formatlanmış sətirə çevirmək istəyəcəksiniz. Bu, Momentin bir az daha qısa olduğu bir nümunədir. İstədiyiniz tarix formatını təsvir edən bir sıra işarələrlə obyektin format metodunu çağırırsınız. sabit tarix = an();
console.log(tarix.format('AA/GG/İYYY')); // 22.02.2026
console.log(tarix.format('AAAA YYYY, s:dd:ss a')); // 22 fevral 2026-cı il, saat 20:18:30
Digər tərəfdən, Temporal bir az daha ətraflı olmağınızı tələb edir. Instant kimi müvəqqəti obyektlərdə obyektin xassələri kimi göstərilən müxtəlif formatlaşdırma seçimlərini qəbul edən toLocaleString metodu var.
sabit tarix = Temporal.Now.instant();
// heç bir arqument olmadan, cari yerli üçün standart formatı əldə edəcəyik console.log(tarix.toLocaleString()); // 22/2/2026, 20:23:36 (en-US yerlisi qəbul edilməklə)
// xüsusi format sətri yaratmaq üçün formatlama seçimlərini keçir console.log(date.toLocaleString('en-US', { ay: 'uzun', gün: 'rəqəm', il: 'rəqəm', saat: '2-rəqəmli', dəqiqə: '2-rəqəmli' }))) // 22 fevral 2026-cı il, saat 20:23
// yalnız format sətirində istədiyiniz sahələri keçirin console.log(date.toLocaleString('en-US', { ay: 'qısa', gün: 'rəqəm' }))) // 22 fevral
Müvəqqəti tarix formatı əslində başlıq altında Intl.DateTimeFormat API-dən (müasir brauzerlərdə artıq asanlıqla mövcuddur) istifadə edir. Bu o deməkdir ki, siz xüsusi formatlaşdırma seçimlərinizlə təkrar istifadə edilə bilən DateTimeFormat obyekti yarada, sonra isə Müvəqqəti obyektləri onun format metoduna keçirə bilərsiniz. Buna görə də, Moment kimi fərdi tarix formatlarını dəstəkləmir. Əgər "2026-cı ilin 1-ci rübü" və ya digər xüsusi formatlaşdırma kimi bir şeyə ehtiyacınız varsa, bəzi fərdi tarix formatlama koduna ehtiyacınız ola bilər və ya üçüncü tərəf kitabxanasına müraciət edə bilərsiniz. const formatter = yeni Intl.DateTimeFormat('en-US', { ay: '2-rəqəmli', gün: '2-rəqəmli', il: 'rəqəm' });
sabit tarix = Temporal.Now.instant(); console.log(formatter.format(tarix)); // 22.02.2026
Moment formatlama nişanlarını yazmaq daha asandır, lakin onlar yerli dil üçün uyğun deyil. Format, ay/gün sifarişi kimi şeyləri "sərt kod" sətirləri ilə əlaqələndirir. Temporal kimi konfiqurasiya obyektindən istifadənin üstünlüyü ondan ibarətdir ki, o, avtomatik olaraq hər hansı bir lokala uyğunlaşacaq və düzgün formatdan istifadə edəcək. sabit tarix = Temporal.Now.instant();
const formatSeçenekler = { ay: 'rəqəm', gün: 'rəqəm', il: 'rəqəm' };
console.log(date.toLocaleString('en-US', formatOptions)); // 22.02.2026
console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026
Tarix hesablamaları Bir çox proqramda bir tarixdə bəzi hesablamaları yerinə yetirməli olacaqsınız. Siz vaxt vahidlərini (günlər, saatlar, saniyələr və s.) əlavə etmək və ya çıxmaq istəyə bilərsiniz. Məsələn, cari tarixiniz varsa, istifadəçiyə indidən 1 həftə sonra tarixi göstərmək istəyə bilərsiniz. Moment obyektlərində bu əməliyyatları yerinə yetirən əlavə və çıxarma kimi üsullar var. Bu funksiyalar dəyər və vahid götürür, məsələn: add(7, 'days'). Moment və Temporal arasındakı çox əhəmiyyətli bir fərq, bu tarix hesablamalarını yerinə yetirərkən, əsas obyektin dəyişdirilməsi və orijinal dəyərinin itirilməsidir. const now = moment();
console.log(indi); // An<2026-02-24T20:08:36-05:00>
const nextWeek = now.add(7, 'günlər'); console.log(növbəti həftə); // An<2026-03-03T20:08:36-05:00>
// Gotcha - orijinal obyekt mutasiyaya uğradı console.log(indi); // An<2026-03-03T20:08:36-05:00>
Orijinal tarixi itirməmək üçün nüsxə yaratmaq üçün Moment obyektində klon çağıra bilərsiniz. indi davam edir= an(); const nextWeek = indi.clone().add(7, 'günlər');
console.log(indi); // An<2026-02-24T20:12:55-05:00>
console.log(növbəti həftə); // An<2026-03-03T20:12:55-05:00>
Digər tərəfdən, Müvəqqəti obyektlər dəyişməzdir. Instant, PlainDate və sair kimi bir obyekt yaratdıqdan sonra həmin obyektin dəyəri heç vaxt dəyişməyəcək. Müvəqqəti obyektlərin əlavə və çıxma üsulları da var. Temporal, hansı obyekt növlərinə hansı zaman vahidlərinin əlavə oluna biləcəyi ilə bağlı bir az seçicidir. Məsələn, bir Aniyə günlər əlavə edə bilməzsiniz:
const now = Temporal.Now.instant(); const nextWeek = now.add({ gün: 7 }); // RangeError: Müvəqqəti xəta: Ən böyük vahid tarix vahidi ola bilməz
Bunun səbəbi, Ani obyektlərin UTC-də müəyyən bir zaman nöqtəsini təmsil etməsi və təqvim-aqnostik olmasıdır. Günün uzunluğu Yaz saatı kimi vaxt qurşağı qaydalarına əsasən dəyişə bildiyi üçün bu hesablama Instant-da mövcud deyil. Bununla belə, siz bu əməliyyatı PlainDateTime kimi digər növ obyektlərdə yerinə yetirə bilərsiniz: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 24.02.2026, 20:23:59
const nextWeek = now.add({ gün: 7 });
// Qeyd edək ki, orijinal PlainDateTime dəyişməz olaraq qalır console.log(now.toLocaleString()); // 24.02.2026, 20:23:59
console.log(nextWeek.toLocaleString()); // 03.03.2026, 20:23:59
Siz həmçinin iki Moment və ya Temporal obyekt arasında nə qədər vaxt olduğunu hesablaya bilərsiniz. Moment-in fərq funksiyası ilə siz dənəvərlik üçün vahid təmin etməlisiniz, əks halda fərqi millisaniyələrlə qaytaracaq. davam tarixi1 = an('2026-02-21T09:00:00'); davam tarixi2 = an('2026-02-22T10:30:00');
console.log(tarix2.diff(tarix1)); // 91800000
console.log(tarix2.diff(tarix1, 'günlər')); // 1
Bunu Müvəqqəti obyektlə etmək üçün başqa bir Temporal obyekti onun qədər və ya ondan sonra metodlarına ötürə bilərsiniz. Bu, vaxt fərqi haqqında məlumatı ehtiva edən Temporal.Duration obyektini qaytarır. Duration obyekti fərqin hər bir komponenti üçün xassələrə malikdir və həmçinin vaxt fərqini təmsil edən ISO 8601 müddət sətrini yarada bilər.
const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');
// bigUnit təmsil etmək üçün ən böyük zaman vahidini təyin edir // müddətin hesablanmasında const fərq = tarix2.beri(tarix1, {ən böyük Vahid: 'gün' });
console.log(diff.days); // 1
console.log(fərq.saatlar); // 1
console.log(fərq.dəqiqələr); // 30
console.log(diff.toString()); // P1DT1H30M // (ISO 8601 uzunluq sətri: 1 gün, 1 saat, 30 dəqiqə)
Tarixləri və Saatları Müqayisə Moment və Temporal, hansının digərindən əvvəl gəldiyini müəyyən etmək üçün tarixləri və vaxtları müqayisə etməyə imkan verir, lakin API ilə fərqli yanaşmalar tətbiq edir. Moment, iki Moment obyektini müqayisə etmək üçün isBefore, isAfter və isSame kimi üsulları təmin edir. davam tarixi1 = an('2026-02-21T09:00:00'); davam tarixi2 = an('2026-02-22T10:30:00');
console.log(tarix1.isBefore(tarix2)); // doğrudur
Temporal eyni tipli iki obyekt arasında müqayisə aparmaq üçün statik müqayisə metodundan istifadə edir. İlk tarix ikincidən əvvəl gəlirsə -1, bərabər olduqda 0 və ya birinci tarix ikincidən sonra gəlirsə 1 qaytarır. Aşağıdakı nümunə iki PlainDate obyektinin necə müqayisə olunacağını göstərir. Temporal.PlainDate.compare üçün hər iki arqument PlainDate obyektləri olmalıdır.
const date1 = Temporal.PlainDate.from({ il: 2026, ay: 2, gün: 24 }); const date2 = Temporal.PlainDate.from({ il: 2026, ay: 3, gün: 24 });
// date1 tarix2-dən əvvəl gəlir, deməli -1 console.log(Temporal.PlainDate.compare(tarix1, tarix2));
// Müxtəlif tipli iki obyekti müqayisə etməyə çalışsaq xəta console.log(Temporal.PlainDate.compare(tarix1, Temporal.Now.instant())); // TypeError: Müvəqqəti xəta: Yanlış PlainDate sahələri təmin edilib.
Xüsusilə, bu, bir sıra Müvəqqəti obyektləri xronoloji olaraq çeşidləməyi asanlaşdırır. // Temporal.PlainDate obyektlərinin massivi sabit tarixlər = [ ... ];
// müqayisə funksiyası kimi Temporal.PlainDate.compare-dən istifadə edin tarixlər.sort(Temporal.PlainDate.müqayisə et);
Saat Zonasının Dönüşümləri Əsas Moment kitabxanası saat qurşağının çevrilməsini dəstəkləmir. Əgər bu funksiyaya ehtiyacınız varsa, siz həmçinin moment-timezone paketini quraşdırmalısınız. Bu paket ağac sarsıla bilməz və buna görə də paketinizin ölçüsünü əhəmiyyətli dərəcədə artıra bilər. Moment-saat qurşağını quraşdırdıqdan sonra tz metodu ilə Moment obyektlərini müxtəlif vaxt zonalarına çevirə bilərsiniz. Digər Moment əməliyyatlarında olduğu kimi, bu, əsası mutasiya edirobyekt. // ABŞ-ın şərq vaxtı ilə const now = moment(); console.log(indi); // An<2026-02-28T20:08:20-05:00>
// Sakit okean vaxtına çevirin. // Orijinal Şərq vaxtı itirildi. now.tz('Amerika/Los_Anceles'); console.log(indi); // An<2026-02-28T17:08:20-08:00>
Temporal.ZonedDateTime obyektindən istifadə edərkən saat qurşağı funksionallığı Temporal API-də qurulur. Bu obyektlərə eyni zamanda, lakin müəyyən edilmiş vaxt zonasında yeni ZonedDateTime qaytaran withTimeZone metodu daxildir. // Yenə ABŞ-ın şərq vaxtını fərz etsək const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 28.02.2026, 20:12:02 EST
// Sakit okean vaxtına çevirin const nowPacific = now.withTimeZone('Amerika/Los_Anceles'); console.log(nowPacific.toLocaleString()); // 28.02.2026, 17:12:02 PST
// Orijinal obyekt dəyişməz qalır console.log(now.toLocaleString()); // 28.02.2026, 20:12:02 EST
Qeyd: toLocaleString tərəfindən qaytarılan formatlanmış dəyərlər, adından da göründüyü kimi, lokaldan asılıdır. Nümunə kodu en-ABŞ dilində hazırlanmışdır, ona görə də format belədir: 28/2/2026, 17:12:02 PST. Başqa yerdə bu fərqli ola bilər. Məsələn, en-GB dilində 28/2/2026, 17:12:02 GMT-8 kimi bir şey əldə edəcəksiniz. Real Dünya Refaktorinqi Tutaq ki, biz vaxt zonaları üzrə tədbirlər planlaşdırmaq üçün proqram qururuq. Bu proqramın bir hissəsi tədbirin vaxtını və tarixini, yerli vaxt qurşağını və hədəf saat qurşağını təmsil edən ISO 8601 sətrini götürən getEventTimes funksiyasıdır. Funksiya hər iki vaxt zonasında hadisə üçün formatlaşdırılmış vaxt və tarix sətirlərini yaradır. Funksiyaya etibarlı vaxt/tarix sətri olmayan giriş sətri verilirsə, o, xəta verəcək. Moment-dən istifadə edən orijinal tətbiq budur (həmçinin an saat qurşağı paketindən istifadə tələb olunur).
'an-zaman qurşağı'ndan idxal anı;
getEventTimes funksiyası (inputString, userTimeZone, targetTimeZone) { const timeFormat = 'AAA D, YYYY, h:dd:ss a z';
// 1. İstifadəçinin saat qurşağında ilkin anı yaradın const eventTime = moment.tz( inputString, moment.ISO_8601, // ISO 8601 sətrini gözləyin doğrudur, // Ciddi təhlil userTimeZone );
// Əgər inputString etibarlı tarixi təmsil etmirsə, xəta atın əgər (!eventTime.isValid()) { yeni xəta atmaq ('Yanlış tarix/saat daxil edilməsi'); }
// 2. Hədəf vaxtı hesablayın // KRİTİK: Biz klonlamalıyıq və ya 'eventTime' əbədi olaraq dəyişməliyik! const targetTime = eventTime.clone().tz(targetTimeZone);
qayıt { yerli: eventTime.format(timeFormat), hədəf: targetTime.format(timeFormat), }; }
const cədvəli = getEventTimes( '2026-03-05T15:00-05:00', 'Amerika/New_York', 'Avropa/London', );
console.log(schedule.local); // 5 mart 2026-cı il, saat 15:00:00 EST
console.log(cədvəl.hədəf); // 5 mart 2026-cı il, GMT vaxtı ilə 20:00:00
Bu nümunədə biz Moment-də faydalı şəkildə qurulmuş ISO 8601 gözlənilən tarix formatından istifadə edirik. Biz həmçinin ciddi təhlildən istifadə edirik, yəni Moment formata uyğun gəlməyən tarix sətri ilə təxmin etməyə çalışmayacaq. Qeyri-ISO tarix sətri keçərsə, bu, etibarsız tarix obyekti ilə nəticələnəcək və biz xəta veririk. Müvəqqəti tətbiq oxşar görünür, lakin bir neçə əsas fərqə malikdir.
getEventTimes funksiyası (inputString, userTimeZone, targetTimeZone) { // 1. Daxiletməni birbaşa Instanta təhlil edin, sonra yaradın // istifadəçi zonasında ZonedDateTime. const instant = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);
// 2. Hədəf zonasına çevirin // Bu avtomatik olaraq YENİ obyekti qaytarır; 'eventTime' təhlükəsizdir. const targetTime = eventTime.withTimeZone(targetTimeZone);
// 3. Intl (daxili) istifadə edərək formatlayın const variantları = { il: 'rəqəm', ay: 'qısa', gün: 'rəqəm', saat: 'rəqəm', dəqiqə: '2-rəqəmli', ikinci: '2-rəqəmli', timeZoneName: 'qısa' };
qayıt { yerli: eventTime.toLocaleString(navigator.language, seçimlər), hədəf: targetTime.toLocaleString(navigator.language, seçimlər) }; }
const cədvəli = getEventTimes( '2026-03-05T15:00-05:00', 'Amerika/New_York', 'Avropa/London', );
console.log(schedule.local); // 5 mart 2026-cı il, 15:00:00 EST
console.log(cədvəl.hədəf); // 5 mart 2026-cı il, GMT vaxtı ilə 20:00:00
Moment ilə nəticədə yaranan tarix sətirləri üçün açıq şəkildə format sətrini təyin etməliyik. İstifadəçinin yerindən və ya dilindən asılı olmayaraq, tədbir vaxtları həmişə 5 mart 2026-cı il, 3:00:00 kimi formatlaşdırılacaq.axşam EST. Ayrıca, açıq şəkildə istisna atmaq məcburiyyətində deyilik. Əgər etibarsız sətir Temporal.Instant.from-a ötürülürsə, Temporal bizim üçün istisnanı atacaq. Qeyd etmək lazım olan bir şey, hətta ciddi təhlil ilə Moment versiyasının daha yumşaq olmasıdır. Temporal sətrin sonunda vaxt zonasının ofsetini tələb edir. Siz həmçinin qeyd etməlisiniz ki, biz navigator.language-dən istifadə etdiyimiz üçün bu kod yalnız brauzer mühitində işləyəcək, çünki naviqator Node.js mühitində təyin olunmayıb. Müvəqqəti tətbiqetmə brauzerin cari dilini (navigator.language) istifadə edir, beləliklə istifadəçi avtomatik olaraq yerli vaxt formatında formatlanmış hadisə vaxtlarını alacaq. ABŞ-da bu, 5 mart 2026-cı il, EST vaxtı ilə 15:00:00-dır. Bununla belə, əgər istifadəçi Londondadırsa, məsələn, tədbir vaxtları 5 mart 2026-cı il, 15:00:00 GMT-5 kimi formatlaşdırılacaq. Xülasə
Fəaliyyət Moment.js Müvəqqəti Cari vaxt an() Temporal.Now.zonedDateTimeISO() İSO təhlili an(küç) Temporal.Instant.from(küç) Vaxt əlavə edin .add(7, 'günlər') (mutasiya edir) .add({ gün: 7 }) (yeni obyekt) Fərq .diff(digər, 'saat') .beri(digər).saat Saat qurşağı .tz('Zona/Ad') .withTimeZone('Zona/Ad')
İlk baxışda fərq bir qədər fərqli ola bilər (və Temporal, bəzən daha ətraflı və daha sərt) sintaksis, lakin Temporal-dan Moment.js-dən istifadə etməyin bir sıra əsas üstünlükləri var:
Daha aydın olmaq daha az sürprizlər və gözlənilməz səhvlər deməkdir. An daha yumşaq görünə bilər, lakin bu, bəzən səhv tarixlərlə nəticələnə bilən “təxminləri” ehtiva edir. Temporal-a etibarsız bir şey versəniz, xəta atır. Kod işləyirsə, etibarlı bir tarixin olduğunu bilirsiniz. Moment tətbiq paketinə əhəmiyyətli ölçü əlavə edə bilər, xüsusən də an saat qurşağı paketindən istifadə edirsinizsə. Temporal heç nə əlavə etmir (hədəf brauzerlərinizə göndərildikdən sonra). Dəyişməzlik sizə tarix çevirmələri və əməliyyatları yerinə yetirərkən heç vaxt məlumatları itirməyəcəyiniz və ya üzərinə yazmayacağınıza əminlik verir. Tələblərinizdən asılı olaraq vaxtın müxtəlif təsvirləri (Instant, PlainDateTime, ZonedDateTime), burada Moment həmişə UTC vaxt damğası ətrafında sarğıdır. Temporal tarix formatlaması üçün Beynəlxalq API-lərdən istifadə edir, bu o deməkdir ki, siz tokenləri açıq şəkildə göstərmədən yerli məlumatlı formatlaşdıra bilərsiniz.
Polyfill haqqında qeydlər Daha əvvəl qeyd edildiyi kimi, @js-temporal/polyfill adlı npm paketi kimi paylanmış Müvəqqəti polifill mövcuddur. Bu gün Temporal-dan istifadə etmək istəyirsinizsə, Safari kimi API-ni hələ göndərməmiş brauzerləri dəstəkləmək üçün bu polifillə ehtiyacınız olacaq. Bununla bağlı pis xəbər, paketinizin ölçüsünü artırmasıdır. Yaxşı xəbər odur ki, o, hələ də an və ya an-zaman qurşağından xeyli az əlavə edir. Bu, npm paket ölçüləri haqqında məlumat təqdim edən Bundlephobia.com veb-saytının bildirdiyi paket ölçülərinin müqayisəsidir (Bundlephobia analizini görmək üçün hər paketin adına klikləyin):
Paket Kiçikləşdirilmiş Kiçikləşdirilmiş və gziplənmişdir @js-temporal/polyfill 154,1 kB 44,1 kB an 294,4 kB 75,4 kB an-zaman qurşağı 1 MB 114,2 kB
Polifillin tarixən yaddaş istifadəsi ilə bağlı bəzi performans problemləri var idi və yazı zamanı o, alfa vəziyyətində hesab olunur. Buna görə, daha yetkin bir vəziyyətə çatana qədər istehsalda istifadə etmək istəməyə bilərsiniz. Digər yaxşı xəbər odur ki, polifillə daha çox ehtiyac qalmayacaq (əlbəttə ki, köhnə brauzerləri dəstəkləmək lazım deyilsə). Yazı zamanı Temporal Chrome, Edge və Firefox-da göndərildi. Safari-də hələ tam hazır deyil, baxmayaraq ki, ən son Technology Preview-də iş vaxtı bayrağı ilə əlçatan görünür.