JavaScript дээр бичигдсэн бараг бүх төрлийн програмууд тодорхой хэмжээгээр цаг, огноотой ажилладаг. Эхэндээ энэ нь зөвхөн суулгасан Date API-ээр хязгаарлагдаж байсан. Энэхүү API нь үндсэн функцийг агуулсан боловч хийж чадах зүйлээрээ хязгаарлагдмал. Moment.js зэрэг гуравдагч талын сангууд, дараа нь Intl API болон шинэ Temporal API зэрэг суулгасан API-ууд нь цаг хугацаа, огноотой ажиллахад илүү уян хатан байдлыг нэмдэг. The Rise and Fall Of Moment.js Moment.js бол цаг хугацаа, огноотой ажиллах хүчирхэг хэрэгслүүдтэй JavaScript номын сан юм. Энэ нь цагийн бүсийг өөрчлөх гэх мэт үндсэн Date API-д байхгүй функцуудыг багтаасан бөгөөд олон нийтлэг үйлдлүүдийг хялбаршуулдаг. Moment нь огноо, цагийг форматлах функцуудыг агуулдаг. Энэ нь олон төрлийн хэрэглээнд өргөн хэрэглэгддэг номын сан болсон. Гэсэн хэдий ч Moment-д ч бас өөрийн гэсэн асуудал байсан. Энэ бол том номын сан бөгөөд програмын багцын хэмжээг мэдэгдэхүйц нэмэгдүүлэх боломжтой. Номын сан нь мод сэгсрэхийг дэмждэггүй тул (номын сангуудын ашиглагдаагүй хэсгүүдийг арилгах боломжтой орчин үеийн багцлагчдын онцлог) та зөвхөн нэг эсвэл хоёр функцийг ашигласан ч Moment номын сан бүхэлдээ багтсан болно. Moment-тэй холбоотой өөр нэг асуудал бол түүний үүсгэсэн объектууд өөрчлөгдөх чадвартай байдаг. Moment объект дээр тодорхой функцуудыг дуудах нь гаж нөлөө үзүүлдэг бөгөөд тухайн объектын утгыг мутаци болгодог. Энэ нь гэнэтийн зан үйл эсвэл алдаа гаргахад хүргэдэг. 2020 онд Moment-ийн засварчид номын санг засвар үйлчилгээний горимд оруулахаар шийдсэн. Шинэ функцийг хөгжүүлэх ажил хийгдээгүй байгаа бөгөөд засварлагчид үүнийг шинэ төслүүдэд ашиглахгүй байхыг зөвлөж байна. date-fns гэх мэт өөр JavaScript огнооны сангууд байдаг ч хотод шинэ тоглуулагч байдаг бөгөөд энэ нь JavaScript: Temporal-д шууд суурилагдсан API юм. Энэ нь анхны Date API-ийн цоорхойг дүүргэхээс гадна Moment болон бусад номын сангаас олдсон зарим хязгаарлалтыг шийддэг шинэ стандарт юм. Түр зуурын гэж юу вэ? Temporal нь орчин үеийн JavaScript-г тодорхойлдог ECMAScript стандартад шинээр нэмэгдсэн цаг, огнооны API юм. 20266 оны 3-р сарын байдлаар энэ нь TC39 процессын 4-р шатанд (JavaScript хэлний санал, нэмэлтийг хянадаг хороо) хүрсэн бөгөөд ECMAScript-ийн тодорхойлолтын дараагийн хувилбарт багтах болно. Энэ нь Chrome 144+ болон Firefox 139+ гэсэн хэд хэдэн хөтөч дээр аль хэдийн хэрэгжсэн бөгөөд Safari удахгүй гарах төлөвтэй байна. Дэмжигдээгүй хөтчүүд болон Node.js-д полифилл ашиглах боломжтой. Temporal API нь ерөнхийдөө цаг хугацааны агшинг илэрхийлэх объектуудыг үүсгэдэг. Эдгээр нь тухайн цагийн бүс дэх бүтэн цагийн болон огнооны тамга байж болно, эсвэл цагийн бүс, огнооны мэдээлэлгүй "ханын цаг"-ын ерөнхий жишээ байж болно. Temporal-ийн зарим гол шинж чанарууд нь:
Огноотой эсвэл огноогүй цаг. Түр хугацааны объект нь тодорхой огнооны тодорхой цагийг эсвэл ямар ч огнооны мэдээлэлгүй цагийг илэрхийлж болно. Тодорхой огноог, цаг хугацаагүй, мөн төлөөлж болно. Цагийн бүсийн дэмжлэг. Түр зуурын объектууд нь цагийн бүсийг бүрэн мэддэг бөгөөд өөр өөр цагийн бүсээр хөрвүүлэх боломжтой. Moment нь цагийн бүсийг дэмждэг боловч цаг хугацааны бүсийн нэмэлт санг шаарддаг. Хувиргах чадвар. Түр зуурын объект үүсгэгдсэн бол түүнийг өөрчлөх боломжгүй. Цагийн арифметик эсвэл цагийн бүсийн хөрвүүлэлт нь үндсэн объектыг өөрчлөхгүй. Үүний оронд тэд шинэ Түр зуурын объектыг үүсгэдэг. 1-д суурилсан индексжүүлэлт. Date API (мөн Moment)-ын нийтлэг алдааны эх үүсвэр нь саруудыг тэг индексжүүлсэн байдаг. Энэ нь 1-р сарыг бид бүгд бодит амьдрал дээр ойлгодог шиг 1-р сар биш харин 0-р сар гэсэн үг юм. 1-д суурилсан индексжүүлэлтийг ашиглан үүнийг түр зуур засдаг - 1-р сар бол 1-р сар. Энэ нь хөтөч дээр суурилагдсан. Temporal нь хөтөч өөрөө API учраас таны програмын багцын хэмжээнд юу ч нэмдэггүй.
Date API алга болохгүй гэдгийг анхаарах нь бас чухал юм. Temporal нь энэ API-г орлож байгаа ч үүнийг устгаагүй эсвэл хуучирдаггүй. Хөтөчүүд Date API-г гэнэт устгавал олон програм эвдэрнэ. Гэсэн хэдий ч Moment нь одоо засвар үйлчилгээний горимд байгаа хуучин төсөл гэж тооцогддог гэдгийг санаарай. Өгүүллийн үлдсэн хэсэгт бид Moment-д суурилсан кодыг шинэ Temporal API руу шилжүүлэх зарим "жор"-ыг авч үзэх болно. Рефактор хийж эхэлцгээе! Огноо ба цаг хугацааны объектуудыг үүсгэх Огноо, цагийг өөрчлөхийн өмнө бид тэдгээрийг төлөөлөх объектуудыг үүсгэх хэрэгтэй. Одоогийн огноо, цагийг харуулсан Moment объектыг үүсгэхийн тулд агшин зуурын функцийг ашиглана уу. const now = moment(); console.log(одоо); // мөч<2026-02-18T21:26:29-05:00>
Энэ объектыг одоо шаардлагатай бол форматлах эсвэл өөрчлөх боломжтой.
// UTC руу хөрвүүлэх //Анхааруулга: Энэ нь Moment объектыг хувиргаж, UTC горимд оруулна! console.log(now.utc()); // мөч<2026-02-19T02:26:29Z>
// форматлагдсан мөрийг хэвлэх - одоо UTC цагийг ашиглаж байгааг анхаарна уу console.log(одоо.format('MM/DD/YYYY hh:mm:ss a')); // 2026-02-19 02:27:07
Moment-ийн талаар санаж байх ёстой гол зүйл бол Moment объект нь цаг хугацаа, огнооны талаарх мэдээллийг үргэлж агуулна. Хэрэв та зөвхөн цагийн мэдээлэлтэй ажиллах шаардлагатай бол энэ нь ихэвчлэн сайн байдаг, гэхдээ энэ нь зуны цаг, үсрэлт жил гэх мэт нөхцөл байдалд гэнэтийн үйлдэл үүсгэж болзошгүй тул огноо нь цагийн тооцоололд нөлөөлдөг. Түр зуурын хувьд илүү уян хатан байдаг. Та Temporal.Instant объект үүсгэснээр одоогийн огноо, цагийг илэрхийлэх объект үүсгэж болно. Энэ нь "эрин үе"-ээс (1970 оны 1-р сарын 1-ний шөнө дунд UTC) хойшхи цаг хугацааны цэгийг илэрхийлнэ. Temporal нь нано секундын түвшний нарийвчлалтайгаар энэ агшин зуурыг цаг тухайд нь лавлаж чадна. const now = Temporal.Now.instant();
// эрин үеэс хойшхи түүхий наносекундыг харна уу console.log(одоо.epochNanoseconds); // 1771466342612000000н
// UTC формат console.log(now.toString()); // 2026-02-19T01:55:27.844Z
// тодорхой цагийн бүсийн формат console.log(now.toString({ цагийн бүс: 'Америк/Нью_Йорк' })); // 2026-02-18T20:56:57.905-05:00
Temporal.Instant объектуудыг мөн from static аргыг ашиглан тодорхой цаг хугацаа, огноогоор үүсгэж болно.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Орон нутгийн цагийн бүсэд агшин зуурыг форматлана. Энэ нь зөвхөн удирддаг гэдгийг анхаарна уу // форматлах - энэ нь moment.utc шиг объектыг мутаци хийхгүй. console.log(myInstant.toString({ цагийн бүс: 'Америк/Нью_Йорк' })); // 2026-02-18Т21:10:00-05:00
Та мөн бусад төрлийн Түр зуурын объектуудыг үүсгэж болно, үүнд:
Temporal.PlainDate: Цагийн мэдээлэлгүй огноо. Temporal.PlainTime: Огнооны мэдээлэлгүй цаг. Temporal.ZonedDateTime: Тодорхой цагийн бүс дэх огноо, цаг.
Эдгээр нь огноо ба/эсвэл цагийг зааж өгөх объектын хамт дуудаж болох from арга эсвэл задлан шинжлэх огнооны мөртэй. // Зүгээр л болзоо const today = Temporal.PlainDate.from({ он: 2026, сар: 2, // 2-р сард 2-г ашиглаж байгааг анхаарна уу өдөр: 18 }); console.log(today.toString()); // 2026-02-18
// Зүгээр л нэг удаа const lunchTime = Temporal.PlainTime.from({ цаг: 12 }); console.log(lunchTime.toString()); // 12:00:00
// АНУ-ын зүүн цагийн бүсийн огноо, цаг const dueAt = Temporal.ZonedDateTime.from({ цагийн бүс: 'Америк/Нью_Йорк', он: 2026, сар: 3, өдөр: 1, цаг: 12, минут: 0, хоёр дахь: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[Америк/Нью_Йорк]
Шинжилгээ Бид огноо, цагийн мэдээллийг программчлан бүтээх талаар авч үзсэн. Одоо задлан шинжлэхийг харцгаая. Шинжилгээ нь Moment нь суулгасан Temporal API-ээс илүү уян хатан байдаг нэг хэсэг юм. Та огнооны мөрийг агшин зуурын функц руу шилжүүлснээр задлан шинжилж болно. Нэг аргументын тусламжтайгаар Moment нь ISO огнооны мөрийг хүлээж байгаа боловч хэрэв та ашиглаж буй огнооны форматыг зааж өгсөн хоёр дахь аргумент өгвөл өөр форматыг ашиглаж болно.
const isoDate = moment('2026-02-21T09:00:00'); const formattedDate = moment('2/21/26 9:00:00', 'О/Ө/ЖЖ:мм:сс');
console.log(isoDate); // мөч<2026-02-21T09:00:00-05:00>
console.log(formattedDate); // мөч<2026-02-21T09:00:00-05:00>
Хуучин хувилбаруудад Moment нь дур зоргоороо форматлагдсан огнооны мөрийг задлан шинжлэхэд хамгийн сайн таамаглал дэвшүүлдэг. Энэ нь урьдчилан таамаглах боломжгүй үр дүнд хүргэж болзошгүй юм. Жишээлбэл, 2026-03-02 2-р сарын 2 эсвэл 3-р сарын 3-ны өдөр үү? Ийм учраас Moment-ын шинэ хувилбарууд нь ISO форматтай огнооны мөргүйгээр дуудагдсан тохиолдолд (хүссэн форматтай хоёр дахь аргументыг өгөөгүй тохиолдолд) хуучирсан анхааруулгыг харуулдаг. Temporal нь зөвхөн тусгайлан форматлагдсан огнооны мөрийг задлан шинжилнэ. Мөр нь ISO 8601 формат эсвэл түүний өргөтгөл болох RFC 9557-тэй нийцсэн байх ёстой. Хэрэв тохирохгүй огнооны мөрийг from арга руу шилжүүлбэл Temporal RangeError-г гаргах болно.
// RFC 9557 огнооны мөрийг ашиглаж байна const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[Америк/Нью_Йорк]'); console.log(myDate.toString({цагын бүс: 'America/New_York' })); // 2026-02-21 09:00:00-05:00
// Үл мэдэгдэх огнооны мөр ашиглаж байна const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // RangeError: Түр зуурын алдаа: Жилийн утгыг задлан шинжлэх явцад буруу тэмдэгт.
Огнооны мөрийн яг шаардлага нь таны ямар төрлийн Түр зуурын объект үүсгэж байгаагаас хамаарна. Дээрх жишээнд Temporal.Instant нь бүрэн ISO шаарддаг8601 эсвэл RFC 9557 огнооны мөр нь цагийн бүсийн зөрүүтэй огноо, цагийг зааж өгөх боловч та огнооны форматын зөвхөн дэд багцыг ашиглан PlainDate эсвэл PlainTime объектуудыг үүсгэж болно. 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
Эдгээр мөрүүд нь хүлээгдэж буй форматтай нийцсэн хэвээр байх ёстой, эс тэгвээс алдаа гарах болно гэдгийг анхаарна уу.
// Тохиромжгүй цагийн мөр ашиглах. Эдгээр нь бүгд RangeError үүсгэх болно. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00');
Мэргэжлийн зөвлөгөө: ISO бус мөрүүдийг зохицуулах Temporal нь найдвартай байдлыг чухалчилдаг тул 2026 оны 01-р сарын 2-ны өдөр шиг мөрийн форматыг таахыг оролдохгүй. Хэрэв таны өгөгдлийн эх сурвалж ийм мөрүүдийг ашигладаг бол та үүнийг Temporal-д ашиглахыг оролдохын өмнө утгуудыг 2026-02-01 гэх мэт ISO стринг болгон өөрчлөхийн тулд зарим нэг стринг боловсруулах шаардлагатай болно.
Форматлаж байна Moment эсвэл Temporal объекттой болмогц та үүнийг хэзээ нэгэн цагт форматлагдсан стринг болгон хөрвүүлэхийг хүсэх байх. Энэ бол Moment нь арай илүү товчилсон жишээ юм. Та объектын форматын аргыг хүссэн огнооны форматыг тодорхойлсон тэмдэгт тэмдэгтээр дууддаг. const огноо = мөч();
console.log(огноо.формат('MM/DD/YYYY')); // 2026.02.22
console.log(огноо.формат('MMMM Do YYYY, h:mm:ss a')); // 2026 оны 2-р сарын 22, 20:18:30
Нөгөөтэйгүүр, Temporal нь танаас арай илүү дэлгэрэнгүй байхыг шаарддаг. Instant гэх мэт түр зуурын объектууд нь объектын шинж чанараар тодорхойлсон янз бүрийн форматлах сонголтыг хүлээн зөвшөөрдөг toLocaleString аргатай.
const date = Temporal.Now.instant();
// ямар ч аргументгүйгээр бид одоогийн хэлний анхдагч форматыг авах болно console.log(огноо.toLocaleString()); // 2026-02-22, 20:23:36 (en-US хэлний хэлээр тооцвол)
// өөрчлөн форматын мөр үүсгэх форматын сонголтуудыг дамжуулна console.log(date.toLocaleString('en-US', { сар: 'урт', өдөр: "тоон", жил: 'тоон', цаг: '2 оронтой', минут: '2 оронтой' }))) // 2026 оны 2-р сарын 22-ны 20:23
// зөвхөн форматын мөрөнд хүссэн талбаруудыг дамжуулна console.log(date.toLocaleString('en-US', { сар: 'богино', өдөр: "тоон" }))) // 2-р сарын 22
Түр хугацааны огнооны формат нь үнэндээ Intl.DateTimeFormat API-г (орчин үеийн хөтөч дээр аль хэдийн ашиглах боломжтой) ашигладаг. Энэ нь та дахин ашиглах боломжтой DateTimeFormat объектыг өөрийн хүссэн форматын сонголтоор үүсгэж, дараа нь түр зуурын объектуудыг форматын арга руу шилжүүлж болно гэсэн үг юм. Үүнээс болж энэ нь Moment шиг өөрчлөн огнооны форматыг дэмждэггүй. Хэрэв танд "2026 оны 1-р улирал" эсвэл бусад тусгай формат хэрэгтэй бол танд огнооны форматын код хэрэгтэй эсвэл гуравдагч талын номын санд хандаарай. const форматлагч = шинэ Intl.DateTimeFormat('en-US', { сар: '2 оронтой', өдөр: '2 оронтой', он: "тоон" });
const date = Temporal.Now.instant(); console.log(formatter.format(огноо)); // 2026.02.22
Moment-ийн форматлах токенуудыг бичихэд илүү хялбар боловч тэдгээр нь тухайн газар нутагт тохиромжгүй байдаг. Формат нь сар/өдөр дараалал гэх мэт зүйлийг "хатуу код"-ыг оруулдаг. Temporal-ын нэгэн адил тохиргооны объектыг ашиглахын давуу тал нь тухайн өгөгдсөн локалд автоматаар дасан зохицож, зөв форматыг ашиглах явдал юм. const date = Temporal.Now.instant();
const formatOptions = { сар: 'тоон', өдөр: "тоон", он: "тоон" };
console.log(date.toLocaleString('en-US', formatOptions)); // 2026.02.22
console.log(date.toLocaleString('en-GB', formatOptions)); // 2026.02.22
Огнооны тооцоолол Олон программ дээр та огноогоор зарим тооцоолол хийх шаардлагатай болно. Та цагийн нэгжийг (өдөр, цаг, секунд гэх мэт) нэмэх эсвэл хасахыг хүсч болно. Жишээлбэл, хэрэв танд одоо байгаа огноо байгаа бол хэрэглэгчдэд 1 долоо хоногийн дараа огноог харуулахыг хүсч болно. Моментийн объектуудад эдгээр үйлдлийг гүйцэтгэх нэмэх, хасах зэрэг аргууд байдаг. Эдгээр функцууд нь утга болон нэгж авдаг, жишээлбэл: add(7, 'days'). Moment болон Temporal хоёрын нэг маш чухал ялгаа нь эдгээр огнооны тооцоог хийх үед үндсэн объект өөрчлөгдөж, анхны үнэ цэнэ нь алдагдах явдал юм. const now = moment();
console.log(одоо); // мөч<2026-02-24T20:08:36-05:00>
const nextWeek = now.add(7, 'өдрүүд'); console.log(дараагийн долоо хоног); // мөч<2026-03-03T20:08:36-05:00>
// Gotcha - анхны объект мутацид орсон console.log(одоо); // мөч<2026-03-03T20:08:36-05:00>
Анхны огноогоо алдахгүйн тулд Moment объект дээр клоныг дуудаж хуулбар үүсгэж болно. const одоо= мөч(); const nextWeek = now.clone().add(7, 'days');
console.log(одоо); // мөч<2026-02-24T20:12:55-05:00>
console.log(дараагийн долоо хоног); // мөч<2026-03-03T20:12:55-05:00>
Нөгөө талаас, Түр зуурын объектууд өөрчлөгддөггүй. Та Instant, PlainDate гэх мэт объект үүсгэсний дараа тухайн объектын утга хэзээ ч өөрчлөгдөхгүй. Түр зуурын объектууд нь нэмэх, хасах аргуудтай байдаг. Цаг хугацааны хувьд аль объектын төрлүүдэд ямар нэгжийг нэмж болохыг бага зэрэг сонгодог. Жишээлбэл, та Шуурхайд хоног нэмэх боломжгүй:
const now = Temporal.Now.instant(); const nextWeek = now.add({өдөр: 7}); // RangeError: Түр зуурын алдаа: Хамгийн том нэгж нь огнооны нэгж байж болохгүй
Учир нь Instant объектууд нь UTC-д тодорхой цаг хугацааны цэгийг төлөөлдөг бөгөөд хуанли-агностик шинж чанартай байдаг. Өдрийн урт нь зуны цаг гэх мэт цагийн бүсийн дүрэмд үндэслэн өөрчлөгдөж болох тул энэ тооцоог Instant дээр хийх боломжгүй. Гэхдээ та энэ үйлдлийг PlainDateTime гэх мэт бусад төрлийн объектууд дээр хийж болно: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 2026-02-24, 20:23:59
const nextWeek = now.add({өдөр: 7});
// Анхны PlainDateTime өөрчлөгдөөгүй гэдгийг анхаарна уу console.log(now.toLocaleString()); // 2026-02-24, 20:23:59
console.log(nextWeek.toLocaleString()); // 3/3/2026, 20:23:59
Та мөн Moment эсвэл Temporal хоёр объектын хооронд хэр их цаг хугацаа байгааг тооцоолж болно. Moment-ийн ялгаа функцийн хувьд та нарийн ширхэгтэй байдлын нэгжийг өгөх хэрэгтэй, эс тэгвээс энэ нь зөрүүг миллисекундээр буцаана. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');
console.log(огноо2.diff(огноо1)); // 91800000
console.log(огноо2.diff(огноо1, 'өдрүүд')); // 1
Үүнийг Temporal объектоор хийхийн тулд та өөр Temporal объектыг түүний хүртэл эсвэл since аргууд руу дамжуулж болно. Энэ нь цагийн зөрүүний талаарх мэдээллийг агуулсан Temporal.Duration объектыг буцаана. Үргэлжлэх хугацаа объект нь ялгааны бүрэлдэхүүн хэсэг бүрийн шинж чанаруудтай бөгөөд цагийн зөрүүг илэрхийлэх ISO 8601 үргэлжлэх хугацааны мөрийг үүсгэж болно.
const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');
// largeUnit нь төлөөлөх хамгийн том цаг хугацааны нэгжийг тодорхойлдог // үргэлжлэх хугацааны тооцоонд const ялгаа = огноо2.с хойш(огноо1, {хамгийн томНэгж: 'өдөр'});
console.log(ялгаа өдөр); // 1
console.log(ялгаа.цаг); // 1
console.log(ялгаа.минут); // 30
console.log(diff.toString()); // P1DT1H30M // (ISO 8601 үргэлжлэх хугацаа: 1 өдөр, 1 цаг, 30 минут)
Огноо, цагийг харьцуулах Moment болон Temporal нь аль аль нь нөгөөгөөсөө өмнө байгааг тодорхойлохын тулд огноо, цагийг харьцуулах боломжийг олгодог боловч API-д өөр өөр хандлагыг ашигладаг. Moment нь Moment хоёр объектыг харьцуулах isBefore, isAfter, isSame зэрэг аргуудыг өгдөг. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');
console.log(date1.isBefore(огноо2)); // үнэн
Temporal нь ижил төрлийн хоёр объектын хооронд харьцуулалт хийхийн тулд статик харьцуулах аргыг ашигладаг. Хэрэв эхний огноо хоёр дахь өдрөөс өмнө ирвэл -1, тэнцүү бол 0, эхний огноо хоёр дахь өдрөөс хойш ирвэл 1-ийг буцаана. Дараах жишээ нь хоёр PlainDate объектыг хэрхэн харьцуулахыг харуулж байна. Temporal.PlainDate.compare аргумент хоёулаа PlainDate объект байх ёстой.
const date1 = Temporal.PlainDate.from({жил: 2026, сар: 2, өдөр: 24}); const date2 = Temporal.PlainDate.from({жил: 2026, сар: 3, өдөр: 24});
// огноо1 нь огноо2-оос өмнө ирдэг тул -1 console.log(Temporal.PlainDate.compare(огноо1, огноо2));
// Бид өөр төрлийн хоёр объектыг харьцуулах гэж оролдвол алдаа гарна console.log(Temporal.PlainDate.compare(огноо1, Temporal.Now.instant())); // TypeError: Түр зуурын алдаа: PlainDate талбаруудыг буруу оруулсан.
Ялангуяа энэ нь түр зуурын объектуудын массивыг он цагийн дарааллаар эрэмбэлэхэд хялбар болгодог. // Temporal.PlainDate объектуудын массив const dates = [... ];
// Temporal.PlainDate.compare-г харьцуулагч функц болгон ашигла dates.sort(Temporal.PlainDate.compare);
Цагийн бүсийн хөрвүүлэлт Moment-ийн үндсэн номын сан нь цагийн бүсийн хөрвүүлэлтийг дэмждэггүй. Хэрэв танд энэ функц хэрэгтэй бол цаг хугацааны бүсийн багцыг суулгах хэрэгтэй. Энэ багц нь мод сэгсрэх боломжгүй тул таны багцын хэмжээг мэдэгдэхүйц нэмэгдүүлэх боломжтой. Цагийн бүсийг суулгасны дараа та Moment объектыг tz аргаар өөр өөр цагийн бүс рүү хөрвүүлж болно. Бусад Moment үйлдлүүдийн нэгэн адил энэ нь далд утгыг өөрчилдөгобъект. // АНУ-ын зүүн цагийг тооцвол const now = moment(); console.log(одоо); // мөч<2026-02-28T20:08:20-05:00>
// Номхон далайн цаг руу хөрвүүлэх. // Дорно дахины анхны цаг алдагдсан. now.tz('Америк/Лос_Анжелес'); console.log(одоо); // мөч<2026-02-28T17:08:20-08:00>
Temporal.ZonedDateTime объектыг ашиглах үед цагийн бүсийн функцийг Temporal API-д суулгасан болно. Эдгээр объектууд нь цаг хугацааны ижил агшин, гэхдээ заасан цагийн бүсэд шинэ ZonedDateTime буцаадаг withTimeZone аргыг агуулдаг. // Дахин хэлэхэд, АНУ-ын зүүн цагийг тооцвол const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 28/2/2026, 20:12:02 EST
// Номхон далайн цаг руу хөрвүүлэх const nowPacific = now.withTimeZone('Америк/Лос_Анжелес'); console.log(nowPacific.toLocaleString()); // 28/2/2026, 17:12:02 PST
// Эх объект өөрчлөгдөөгүй хэвээр байна console.log(now.toLocaleString()); // 28/2/2026, 20:12:02 EST
Тэмдэглэл: toLocaleString-ийн буцаасан форматлагдсан утгууд нь нэрнээс нь харахад локал тохиргооноос хамаарна. Загвар кодыг en-US хэл дээр боловсруулсан тул формат нь дараах байдалтай байна: 28/2/2026, 17:12:02 PST. Өөр бүс нутагт энэ нь өөр байж болно. Жишээлбэл, en-GB хэл дээр та 28/2/2026, 17:12:02 GMT-8 гэх мэт зүйлийг авах болно. Бодит ертөнцийн рефакторинг Бид цагийн бүс дэх үйл явдлуудыг төлөвлөх програмыг бүтээж байна гэж бодъё. Энэхүү програмын нэг хэсэг нь үйл явдлын цаг, огноо, орон нутгийн цагийн бүс, зорилтот цагийн бүсийг төлөөлөх ISO 8601 мөрийг авдаг getEventTimes функц юм. Функц нь үйл явдлын хоёр цагийн бүсэд форматлагдсан цаг, огнооны мөрүүдийг үүсгэдэг. Хэрэв функцэд хүчинтэй цаг/огнооны мөр биш оролтын мөр өгөгдсөн бол энэ нь алдаа гаргах болно. Moment (мөн агшин цагийн бүсийн багцыг ашиглах шаардлагатай) ашигласан анхны хэрэгжилт энд байна.
'moment-time zone'-ээс мөчийг импортлох;
функц getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMD D, YYYY, h:mm:ss a z';
// 1. Хэрэглэгчийн цагийн бүсэд эхний мөчийг үүсгэнэ const eventTime = moment.tz( inputString, moment.ISO_8601, // ISO 8601 мөрийг хүлээж байна үнэн, // Хатуу задлан шинжлэх userTimeZone );
// Хэрэв inputString нь хүчинтэй огноог илэрхийлээгүй бол алдаа гарга хэрэв (!eventTime.isValid()) { шинэ алдаа хаях('Огноо/цагийн оролт буруу'); }
// 2. Зорилтот хугацааг тооцоол // ШҮҮХ: Бид клон хийх ёстой, эсвэл 'eventTime' нь үүрд өөрчлөгдөх ёстой! const targetTime = eventTime.clone().tz(targetTimeZone);
буцах { орон нутгийн: eventTime.format(timeFormat), зорилтот: targetTime.format(timeFormat), }; }
const хуваарь = getEventTimes( '2026-03-05T15:00-05:00', 'Америк/Нью_Йорк', "Европ/Лондон", );
console.log(хуваарь.local); // 2026 оны 3-р сарын 5, 15:00:00 EST
console.log(хуваарь.зорилтот); // 2026 оны 3-р сарын 5, GMT 20:00:00
Энэ жишээнд бид ISO 8601 стандартын хүлээгдэж буй огнооны форматыг ашиглаж байгаа бөгөөд энэ нь Moment-д тустай. Бид мөн хатуу задлан шинжилгээг ашиглаж байгаа бөгөөд энэ нь Moment форматтай тохирохгүй огнооны мөрийг таахыг оролдохгүй гэсэн үг юм. Хэрэв ISO-ийн бус огнооны мөрийг дамжуулбал энэ нь хүчингүй огнооны объект үүсгэх бөгөөд бид алдаа гаргадаг. Түр зуурын хэрэгжилт нь ижил төстэй боловч хэд хэдэн гол ялгаатай байдаг.
функц getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. Оролтыг шууд Instant-д задлан шинжилж, дараа нь үүсгэнэ // хэрэглэгчийн бүсэд ZonedDateTime. const instant = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);
// 2. Зорилтот бүс рүү хөрвүүлэх // Энэ нь автоматаар ШИНЭ объектыг буцаана; 'eventTime' нь аюулгүй. const targetTime = eventTime.withTimeZone(targetTimeZone);
// 3. Intl (бүтээл) ашиглан форматлах const сонголт = { жил: 'тоон', сар: 'богино', өдөр: "тоон", цаг: 'тоон', минут: '2 оронтой', хоёр дахь: '2 оронтой', цагийн бүсийн нэр: 'богино' };
буцах { локал: eventTime.toLocaleString(navigator.language, сонголтууд), зорилтот: targetTime.toLocaleString(navigator.language, сонголтууд) }; }
const хуваарь = getEventTimes( '2026-03-05T15:00-05:00', 'Америк/Нью_Йорк', "Европ/Лондон", );
console.log(хуваарь.local); // 2026 оны 3-р сарын 5, 15:00:00 EST
console.log(хуваарь.зорилтот); // 2026 оны 3-р сарын 5, GMT 20:00:00
Moment-ийн тусламжтайгаар бид үүссэн огнооны мөрүүдэд форматын мөрийг тодорхой зааж өгөх ёстой. Хэрэглэгчийн байршил, нутаг дэвсгэрээс үл хамааран үйл явдлын цагийг 2026 оны 3-р сарын 5, 3:00:00 гэж форматлах болно.pm EST. Түүнчлэн, бид онцгой тохиолдол гаргах шаардлагагүй. Хэрэв хүчингүй мөрийг Temporal.Instant.from руу дамжуулсан бол Temporal бидэнд үл хамаарах зүйлийг хийх болно. Анхаарах нэг зүйл бол хатуу задлан шинжилсэн ч Moment хувилбар нь илүү зөөлөн хэвээр байна. Temporal нь мөрийн төгсгөлд цагийн бүсийн зөрүүг шаарддаг. Бид navigator.language-г ашиглаж байгаа тул Node.js орчинд навигатор тодорхойлогдоогүй тул энэ код зөвхөн хөтчийн орчинд ажиллана гэдгийг анхаарна уу. Түр зуурын хэрэгжилт нь хөтчийн одоогийн локал тохиргоог (navigator.language) ашигладаг тул хэрэглэгч үйл явдлын цагийг өөрийн орон нутгийн цагийн форматаар автоматаар форматлах болно. АНУ-ын нутаг дэвсгэрт энэ нь 2026 оны 3-р сарын 5, EST 15:00:00 цаг юм. Гэсэн хэдий ч хэрэв хэрэглэгч Лондонд байгаа бол үйл явдлын цагийг 2026 оны 3-р сарын 5-ны 15:00:00 GMT-5 гэж форматлах болно. Дүгнэлт
Үйлдэл Moment.js Түр зуурын Одоогийн цаг мөч() Temporal.Now.zonedDateTimeISO() ISO задлан шинжилж байна мөч(str) Temporal.Instant.from(str) Цаг нэмнэ .add(7, 'өдөр') (мутац) .add({ өдөр: 7 }) (шинэ объект) Ялгаа .diff(бусад, 'цаг') .с хойш (бусад).цагаас хойш Цагийн бүс .tz('Бүс/Нэр') .withTimeZone('Бүс/Нэр')
Өнгөц харахад ялгаа нь арай өөр байж болох ч (түр зуурын хувьд заримдаа илүү дэлгэрэнгүй, илүү хатуу) синтакс байж болох ч Temporal-г Moment.js-ээс ашиглах нь хэд хэдэн гол давуу талтай:
Илүү тодорхой байх нь гэнэтийн зүйл, хүсээгүй алдаанууд багасна гэсэн үг юм. Энэ мөч нь илүү зөөлөн мэт санагдаж болох ч энэ нь "таамаглал"-ыг агуулдаг бөгөөд энэ нь заримдаа буруу огноог үүсгэдэг. Хэрэв та Temporal-д хүчингүй зүйл өгвөл энэ нь алдаа гаргадаг. Хэрэв код ажиллаж байвал та хүчинтэй огноотой гэдгээ мэднэ. Moment нь аппликешны багцад ихээхэн хэмжээгээр нэмэгдэх болно, ялангуяа та агшин цагийн бүсийн багцыг ашиглаж байгаа бол. Temporal нь юу ч нэмдэггүй (таны зорилтот хөтчүүдэд хүргэгдсэний дараа). Хувиргах чадвар нь огноог хөрвүүлэх, үйлдлүүдийг хийхдээ өгөгдлийг хэзээ ч алдахгүй, дарж бичихгүй гэсэн итгэлийг өгдөг. Таны шаардлагаас хамааран цаг хугацааны өөр өөр дүрслэл (Instant, PlainDateTime, ZonedDateTime) бөгөөд Moment нь UTC цагийн тэмдгийн эргэн тойронд үргэлж байдаг. Temporal нь огнооны форматын хувьд Intl API-г ашигладаг бөгөөд энэ нь та токенуудыг тодорхой зааж өгөхгүйгээр локал тохиргоог хийх боломжтой гэсэн үг юм.
Polyfill дээрх тэмдэглэл Өмнө дурьдсанчлан, @js-temporal/polyfill нэртэй npm багц хэлбэрээр тараагдсан Temporal polyfill байдаг. Хэрэв та өнөөдөр Temporal-г ашиглахыг хүсвэл Safari зэрэг API-г илгээгээгүй байгаа хөтчүүдийг дэмжихийн тулд танд энэ полифилл хэрэгтэй болно. Муу мэдээ гэвэл энэ нь таны багцын хэмжээг нэмэгдүүлэх болно. Сайн мэдээ гэвэл энэ нь агшин эсвэл цаг хугацааны бүсээс хамаагүй бага нэмсэн хэвээр байна. Npm багцын хэмжээг харуулсан Bundlephobia.com вэбсайтаас мэдээлснээр багцын хэмжээнүүдийн харьцуулалтыг энд үзүүлэв (багц бүрийн нэр дээр дарж, Bundlephobia шинжилгээг үзнэ үү):
Багц Жижиглэсэн Жижиглэсэн & gzip @js-temporal/polyfill 154.1 кБ 44.1 кБ мөч 294.4 кБ 75.4 кБ цаг хугацааны бүс 1 MB 114.2 кБ
Мөн полифилл нь санах ойн ашиглалттай холбоотой гүйцэтгэлийн зарим асуудалтай тулгардаг байсан бөгөөд үүнийг бичиж байх үед альфа төлөвт байсан гэж үздэг. Үүнээс болж та үүнийг илүү боловсорч гүйцсэн төлөвт хүрэх хүртэл үйлдвэрлэлд ашиглахыг хүсэхгүй байж магадгүй юм. Өөр нэг сайн мэдээ бол полифилл илүү удаан шаардлагагүй болно гэж найдаж байна (мэдээж хуучин хөтчүүдийг дэмжих шаардлагагүй бол). Бичиж байх үед Temporal нь Chrome, Edge, Firefox дээр хүргэгдсэн. Энэ нь Safari-д хараахан бэлэн болоогүй байгаа ч хамгийн сүүлийн үеийн Технологийн Урьдчилан үзэх хувилбар дээр ажиллах цагийн далбаатай байгаа бололтой.