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 объектисинде белгилүү функцияларды чакыруу терс таасирлерге ээ жана ал объекттин маанисин мутациялайт. Бул күтүлбөгөн жүрүм-турумга же мүчүлүштүктөргө алып келиши мүмкүн. 2020-жылы Momentтин тейлөөчүлөрү китепкананы тейлөө режимине коюуну чечишкен. Эч кандай жаңы функция иштелип чыккан жок жана тейлөөчүлөр аны жаңы долбоорлор үчүн колдонууну сунушташат. Башка JavaScript дата китепканалары бар, мисалы, date-fns, бирок шаарда жаңы оюнчу бар, API түз эле JavaScript: Temporal ичине орнотулган. Бул баштапкы Date API тешиктерин толтурган жаңы стандарт, ошондой эле Moment жана башка китепканаларда табылган кээ бир чектөөлөрдү чечет. Убактылуу деген эмне? Temporal — заманбап JavaScriptти аныктаган ECMAScript стандартына кошулуп жаткан жаңы убакыт жана дата API. 20266-жылдын мартына карата ал TC39 процессинин 4-этабына жетти (JavaScript тилине сунуштарды жана толуктоолорду көзөмөлдөгөн комитет) жана ECMAScript спецификациясынын кийинки версиясына киргизилет. Ал буга чейин эле бир нече браузерлерде ишке ашырылган: Chrome 144+ жана Firefox 139+, Safari жакында уланат деп күтүлүүдө. Полифилл колдоого алынбаган браузерлер жана Node.js үчүн да жеткиликтүү. Temporal API жалпысынан убакыттын көз ирмемдерин чагылдырган объекттерди түзөт. Булар берилген убакыт алкагындагы толук убакыт жана дата штамптары болушу мүмкүн, же алар эч кандай убакыт алкагы же дата маалыматы жок "дубал сааты" убакытынын жалпы үлгүсү болушу мүмкүн. Temporal негизги өзгөчөлүктөрүнүн кээ бирлери төмөнкүлөр:
Даталары бар же жок убакыттар. Убактылуу объект белгилүү бир датадагы белгилүү бир убакытты же эч кандай дата маалыматы жок убакытты көрсөтө алат. Белгилүү бир дата, убактысы жок да көрсөтүлүшү мүмкүн. Убакыт алкагын колдоо.Убактылуу объекттер толугу менен убакыт алкагын билишет жана аларды ар кандай убакыт алкактары боюнча өзгөртсө болот. Moment убакыт алкагын да колдойт, бирок ал кошумча убакыт алкагынын китепканасын талап кылат. Immutability. Убактылуу объект түзүлгөндөн кийин, аны өзгөртүүгө болбойт. Убакыттын арифметикасы же убакыт алкагынын конверсиялары негизги объектти өзгөртпөйт. Анын ордуна, алар жаңы Убактылуу объектти жаратат. 1-негизделген индекстөө. Date API менен мүчүлүштүктөрдүн жалпы булагы (ошондой эле Moment менен) айлар нөлдүк индекстелет. Бул реалдуу жашоодо баарыбыз түшүнгөндөй январь 1 ай эмес, 0 ай экенин билдирет. Убактылуу муну 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(now.format('MM/DD/YYYY сс:мм:сс a')); // 19.02.2026 02:27:07
Moment жөнүндө эстен чыгарбоо керек болгон негизги нерсе, Moment объекти дайыма убакыт жана дата жөнүндө маалыматты камтыйт. Эгер сизге убакыт маалыматы менен гана иштешиңиз керек болсо, бул адатта жакшы, бирок ал жайкы жарыктан сактоо убактысы же секирик жылдар сыяктуу кырдаалдарда күтүүсүз жүрүм-турумга алып келиши мүмкүн, мында дата убакытты эсептөөгө таасирин тийгизет. Убактылуу көбүрөөк ийкемдүү. Temporal.Instant объектин түзүү менен учурдагы дата менен убакытты чагылдырган объект түзө аласыз. Бул "доор" (1970-жылдын 1-январында түн жарымы UTC) бери убакыт менен аныкталган убакыт чекити билдирет. Temporal наносекунд деңгээлиндеги тактык менен бул көз ирмемди өз убагында шилтемелей алат. const now = Temporal.Now.instant();
// доордон бери чийки наносекунддарды көрүү console.log(now.epochNanoseconds); // 1771466342612000000n
// UTC үчүн формат console.log(now.toString()); // 2026-02-19T01:55:27.844Z
// белгилүү бир убакыт алкагы үчүн формат console.log(now.toString({timeZone: 'America/New_York' })); // 2026-02-18T20:56:57.905-05:00
Temporal.Instant объектилери да статикалык ыкманы колдонуу менен белгилүү бир убакыт жана дата үчүн түзүлүшү мүмкүн.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Жергиликтүү убакыт алкагында заматта форматтоо. Бул жөн гана көзөмөлдөй турганын эске алыңыз // форматтоо - бул moment.utc сыяктуу объектти мутация кылбайт. console.log(myInstant.toString({timeZone: 'America/New_York' })); // 2026-02-18T21:10:00-05:00
Сиз ошондой эле Убактылуу объекттердин башка түрлөрүн түзө аласыз, анын ичинде:
Temporal.PlainDate: Убакыт маалыматы жок дата. Temporal.PlainTime: Датасы маалыматы жок убакыт. Temporal.ZonedDateTime: Белгилүү бир убакыт алкагындагы күн жана убакыт.
Булардын ар биринде датаны жана/же убакытты же талдоо үчүн дата саптарын көрсөтүүчү объект менен чакыра турган from ыкмасы бар. // Жөн гана жолугушуу const today = Temporal.PlainDate.from({ жыл: 2026, ай: 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('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 каалагандай форматталган дата саптарын талдоо үчүн эң жакшы божомолду жасайт. Бул күтүлбөгөн натыйжаларга алып келиши мүмкүн. Мисалы, 02-03-2026 2-февральбу же 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({timeZone: 'America/New_York' })); // 2026-02-21T09:00:00-05:00
// Белгисиз дата сабын колдонуу const otherDate = Temporal.Instant.from('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 AM');
Профессионалдык кеңеш: ISO эмес саптарды иштетүү Убактылуу ишенимдүүлүктү биринчи орунга койгондуктан, 02-01-2026 сыяктуу саптын форматын болжолдоого аракет кылбайт. Эгер маалымат булагыңыз ушундай саптарды колдонсо, аны Temporal менен колдонууга аракет кылуудан мурун маанилерди 2026-02-01 сыяктуу ISO сапка кайра иретке келтирүү үчүн бир нече сап манипуляциясын жасашыңыз керек болот.
Форматтоо Сизде Moment же Убактылуу объект болгондон кийин, сиз аны кандайдыр бир учурда форматталган сапка айландыргыңыз келет. Бул Moment бир аз кыскараак болгон учур. Сиз объекттин формат ыкмасын каалаган дата форматын сүрөттөгөн белгилердин саптары менен чакырасыз. конст датасы = момент();
console.log(date.format('MM/DD/YYYY')); // 22.02.2026
console.log(date.format('MMMM Do YYYY, h:mm:ss a')); // 22-февраль 2026-жыл, 20:18:30
Башка жагынан алганда, Temporal сизден бир аз кененирээк болууну талап кылат. Instant сыяктуу убактылуу объекттерде объекттин касиеттери катары көрсөтүлгөн ар кандай форматтоо параметрлерин кабыл алган toLocaleString ыкмасы бар.
const date = Temporal.Now.instant();
// эч кандай аргументсиз, биз учурдагы тил үчүн демейки форматты алабыз console.log(date.toLocaleString()); // 22.02.2026, 20:23:36 (en-US тилин кабыл алуу менен)
// ыңгайлаштырылган формат сапты түзүү үчүн форматтоо параметрлерин өткөрүү console.log(date.toLocaleString('en-US', { ай: "узак", күн: 'сандык', жыл: 'сандык', саат: '2-сан', мүнөт: '2-сан' }))) // 22-февраль, 2026-жыл, 20:23
// формат сабында сиз каалаган талааларды гана өткөрүңүз console.log(date.toLocaleString('en-US', { ай: "кыска", күн: 'сандык' }))) // 22-февраль
Убактылуу датаны форматтоо чындыгында капоттун астындагы Intl.DateTimeFormat API'ни (заманбап браузерлерде оңой жеткиликтүү) колдонот. Бул сиздин ыңгайлаштырылган форматтоо параметрлери менен кайра колдонулуучу DateTimeFormat объектин түзүп, андан кийин Убактылуу объекттерди анын формат ыкмасына өткөрө аласыз дегенди билдирет. Ушундан улам, ал Moment сыяктуу жеке дата форматтарын колдобойт. Эгер сизге '2026-жылдын 1-чейрегинде' же башка адистештирилген форматтоо керек болсо, датаны форматтоо коду керектелет же үчүнчү тараптын китепканасына кайрылыңыз. const форматтоочу = жаңы Intl.DateTimeFormat('en-US', { ай: '2-сан', күн: '2-сан', жыл: 'сандык' });
const date = Temporal.Now.instant(); console.log(formatter.format(дата)); // 22.02.2026
Моменттин форматтоо белгилерин жазуу оңой, бирок алар тилге ылайыктуу эмес. Формат саптары "катуу код" сыяктуу нерселерди ай/күн тартиби. Конфигурация объектисин колдонуунун артыкчылыгы, Temporal сыяктуу эле, ал автоматтык түрдө ар кандай тилге ылайыкташып, туура форматты колдонот. const date = Temporal.Now.instant();
const formatOptions = { ай: 'сандык', күн: 'сандык', жыл: 'сандык' };
console.log(date.toLocaleString('en-US', formatOptions)); // 22.02.2026
console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026
Даталарды эсептөө Көптөгөн тиркемелерде сиз датага кээ бир эсептөөлөрдү жүргүзүүгө туура келет. Убакыттын бирдиктерин (күндөр, сааттар, секундалар ж.б.) кошуп же кемитүүнү кааласаңыз болот. Мисалы, сизде учурдагы күн болсо, колдонуучуга 1 жумадан кийинки күндү көрсөтсөңүз болот. Момент объекттеринин бул операцияларды аткарган кошуу жана кемитүү сыяктуу ыкмалары бар. Бул функциялар маанини жана бирдикти алат, мисалы: add(7, "күн"). 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 азыр= moment(); const nextWeek = now.clone().add(7, 'күн');
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()); // 24.02.2026, 20:23:59
const nextWeek = now.add({күн: 7});
// Түпнуска PlainDateTime өзгөрүүсүз калганына көңүл буруңуз console.log(now.toLocaleString()); // 24.02.2026, 20:23:59
console.log(nextWeek.toLocaleString()); // 03.03.2026, 20:23:59
Ошондой эле эки Момент же Убактылуу объектилердин ортосунда канча убакыт бар экенин эсептей аласыз. Moment's diff функциясы менен гранулдуулук үчүн бирдикти беришиңиз керек, антпесе ал айырманы миллисекунд менен кайтарат. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');
console.log(date2.diff(date1)); // 91800000
console.log(date2.diff(date1, 'күн')); // 1
Муну Убактылуу объект менен аткаруу үчүн, башка Убактылуу объектти анын чейин же бери ыкмаларына өткөрсөңүз болот. Бул убакыт айырмасы жөнүндө маалыматты камтыган Temporal.Duration объектин кайтарат. 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 diff = date2.since(date1, {en чоңБирдик: 'күн'});
console.log(diff.days); // 1
console.log(diff.hours); // 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(date2)); // чын
Убактылуу бир типтеги эки объекттин ортосунда салыштыруу жүргүзүү үчүн статикалык салыштыруу ыкмасын колдонот. Эгер биринчи дата экинчисинен мурун келсе -1, тең болсо 0 же биринчи дата экинчиден кийин келсе 1 кайтарат. Төмөнкү мисалда эки PlainDate объектисин кантип салыштыруу керектиги көрсөтүлгөн. Temporal.PlainDate.compare аргументи тең PlainDate объекттери болушу керек.
const date1 = Temporal.PlainDate.from({жыл: 2026, ай: 2, күн: 24}); const date2 = Temporal.PlainDate.from({жыл: 2026, ай: 3, күн: 24});
// date1 дата2ден мурун келет, демек -1 console.log(Temporal.PlainDate.compare(date1, date2));
// Эгерде биз ар кандай типтеги эки объектти салыштырууга аракет кылсак, ката console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: Убактылуу ката: Жараксыз PlainDate талаалары берилген.
Тактап айтканда, бул Убактылуу объекттердин массивдерин хронологиялык тартипте иреттөөнү жеңилдетет. // Temporal.PlainDate объекттеринин массиви const dates = [... ];
// салыштыруучу функция катары Temporal.PlainDate.compare колдонуңуз dates.sort(Temporal.PlainDate.compare);
Убакыт алкагынын конверсиялары Моменттин негизги китепканасы убакыт алкагын өзгөртүүнү колдобойт. Эгер сизге бул функция керек болсо, анда убакыт алкагы топтомун орнотуу керек. Бул пакет дарактарды титиретпейт, ошондуктан сиздин таңгактын өлчөмүн олуттуу түрдө кошо алат. Момент-убакыт алкагын орноткондон кийин, tz ыкмасы менен Moment объекттерин ар кандай убакыт алкактарына которсоңуз болот. Башка Moment операциялары сыяктуу эле, бул негизги мутацияларды түзөтобъект. // АКШнын чыгыш убактысы боюнча const now = moment(); console.log(азыр); // Момент<2026-02-28T20:08:20-05:00>
// Тынч океан убактысына которуу. // Баштапкы чыгыш убактысы жоголду. now.tz('America/Los_Angeles'); 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.02.2026, 20:12:02 EST
// Тынч океан убактысына которуу const nowPacific = now.withTimeZone('America/Los_Angeles'); console.log(nowPacific.toLocaleString()); // 28.02.2026, 17:12:02 PST
// Баштапкы объект өзгөрүүсүз калат console.log(now.toLocaleString()); // 28.02.2026, 20:12:02 EST
Эскертүү: toLocaleString тарабынан кайтарылган форматталган маанилер, аты айтып тургандай, тилге көз каранды. Үлгү коду en-US тилинде иштелип чыккан, андыктан формат төмөнкүдөй: 28.02.2026, 17:12:02 PST. Башка тилде бул башкача болушу мүмкүн. Мисалы, en-GB тилинде, сиз 28/2/2026, 17:12:02 GMT-8 сыяктуу нерсени аласыз. Чыныгы дүйнөдөгү рефакторинг Биз убакыт алкактары боюнча иш-чараларды пландаштыруу үчүн колдонмо куруп жатабыз дейли. Бул колдонмонун бир бөлүгү иш-чаранын убактысын жана датасын, жергиликтүү убакыт алкагын жана максаттуу убакыт алкагын билдирген ISO 8601 сабын алган getEventTimes функциясы болуп саналат. Функция эки убакыт алкагындагы окуя үчүн форматталган убакыт жана дата саптарын түзөт. Функцияга жарактуу убакыт/күн сабы эмес киргизүү сабы берилсе, ал ката кетирет. Бул жерде Moment (ошондой эле момент-убакыт алкагынын пакетин колдонууну талап кылат) колдонуп, баштапкы ишке ашыруу.
"момент-убакыт алкагынан" учурду импорттоо;
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 жарактуу датаны билдирбесе, ката кетириңиз if (!eventTime.isValid()) { throw new Error('Дата/убакыт туура эмес киргизүү'); }
// 2. Максаттуу убакытты эсептеңиз // КРИТИКАЛЫК: Биз клондашыбыз керек, же 'eventTime' түбөлүккө өзгөрөт! const targetTime = eventTime.clone().tz(targetTimeZone);
кайтуу { жергиликтүү: eventTime.format(timeFormat), максаттуу: targetTime.format(timeFormat), }; }
const расписание = getEventTimes( '2026-03-05T15:00-05:00', 'Америка/Нью_Йорк', "Европа/Лондон", );
console.log(schedule.local); // 5-март, 2026-жыл, 15:00:00 EST
console.log(график.максат); // 2026-жылдын 5-марты, GMT саат 20:00:00
Бул мисалда биз ISO 8601 күтүлгөн дата форматын колдонуп жатабыз, ал Моментке пайдалуу. Биз ошондой эле катуу талдоону колдонуп жатабыз, башкача айтканда 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-сан", timeZoneName: 'кыска' };
кайтуу { жергиликтүү: eventTime.toLocaleString(navigator.language, опциялар), максаттуу: targetTime.toLocaleString(navigator.language, опциялар) }; }
const расписание = getEventTimes( '2026-03-05T15:00-05:00', 'Америка/Нью_Йорк', "Европа/Лондон", );
console.log(schedule.local); // 5-март, 2026-жыл, 15:00:00 EST
console.log(график.максат); // 5-март, 2026-жыл, GMT саат 20:00:00
Moment менен биз пайда болгон дата саптары үчүн формат сабын так көрсөтүшүбүз керек. Колдонуучунун жайгашкан жерине же тилге карабастан, иш-чаранын убактысы ар дайым 2026-жылдын 5-марты, 3:00:00 болуп форматталаткечки саат EST. Ошондой эле, биз ачык-айкын өзгөчө ыргытуу керек эмес. Эгерде жараксыз сап Temporal.Instant.fromга өткөрүлсө, Temporal биз үчүн өзгөчө кырдаалды жаратат. Белгилей кетчү нерсе, катуу талдоо менен да, Moment версиясы дагы эле жумшак. Убактылуу саптын аягындагы убакыт алкагын алмаштырууну талап кылат. Биз navigator.language колдонуп жаткандыктан, бул код серепчи чөйрөсүндө гана иштей турганын белгилешиңиз керек, анткени навигатор Node.js чөйрөсүндө аныкталбайт. Убактылуу ишке ашыруу браузердин учурдагы тилин (navigator.language) колдонот, ошондуктан колдонуучу автоматтык түрдө жергиликтүү убакыт форматында форматталган окуя убакыттарын алат. Америка Кошмо Штаттарында, бул 2026-жылдын 5-марты, саат 15:00:00 EST. Бирок, эгерде колдонуучу Лондондо болсо, мисалы, окуянын убактысы 2026-жылдын 5-марты, 15:00:00 GMT-5 катары форматталат. Жыйынтык
Акция Moment.js Убактылуу Учурдагы убакыт moment() Temporal.Now.zonedDateTimeISO() талдоо ISO moment(str) Temporal.Instant.from(str) Убакыт кошуу .add(7, 'күн') (мутациялар) .add({күн: 7}) (жаңы объект) Айырма .diff(башка, 'саат') .бери(башка).саат Убакыт алкагы .tz('Зона/Аты') .withTimeZone('Зона/Аты')
Бир караганда, айырма бир аз башкача болушу мүмкүн (жана Убактылуу учурда, кээде кененирээк жана катуураак) синтаксис, бирок Temporalды Moment.jsге караганда колдонуунун бир нече негизги артыкчылыктары бар:
Ачыкыраак болуу сюрприздердин жана күтүлбөгөн мүчүлүштүктөрдүн азайышын билдирет. Көз ирмем жумшак болуп көрүнүшү мүмкүн, бирок ал "болжолдоолорду" камтыйт, бул кээде туура эмес даталарга алып келиши мүмкүн. Эгер сиз Убактылуу нерсеге жараксыз нерсени берсеңиз, ал ката кетирет. Эгер код иштесе, сизде жарактуу дата бар экенин билесиз. Момент колдонмонун таңгагына олуттуу өлчөмдө кошушу мүмкүн, айрыкча, сиз момент-убакыт алкагынын пакетин колдонуп жатсаңыз. Убактылуу эч нерсе кошпойт (ал максаттуу браузерлериңизге жөнөтүлгөндөн кийин). Өзгөрбөстүк датаны өзгөртүү жана операцияларды аткарууда маалыматтарды эч качан жоготпойсуз же кайра жазбайсыз деген ишенимди берет. Убакыттын ар кандай көрсөтүлүшү (Instant, PlainDateTime, ZonedDateTime) сиздин талаптарыңызга жараша, мында Moment дайыма UTC убакыт белгисинин айланасында оролот. Temporal датаны форматтоо үчүн Intl API'лерин колдонот, демек, токендерди так көрсөтпөстөн, тилди билген форматтасаңыз болот.
Polyfill боюнча эскертүүлөр Мурда айтылгандай, @js-temporal/polyfill деп аталган npm пакети катары таратылган Убактылуу полифилл бар. Эгер сиз бүгүн Temporal колдонгуңуз келсе, Safari сыяктуу API жөнөтө элек браузерлерди колдоо үчүн сизге бул политолтур керек болот. Бул менен жаман кабар, ал сиздин таңгактын өлчөмүн кошот. Жакшы жаңылык, ал дагы эле көз ирмемге же убакыт алкагына караганда бир кыйла азыраак кошот. Бул жерде Bundlephobia.com, npm пакетинин өлчөмдөрү жөнүндө маалымат берген веб-сайт тарабынан билдирилген таңгак өлчөмдөрүнүн салыштыруусу (Bundlephobia анализин көрүү үчүн ар бир пакеттин атын чыкылдатыңыз):
Пакет Кичирейтилген Кичирейтилген жана gzipped @js-temporal/polyfill 154,1 кБ 44,1 кБ учур 294,4 кБ 75,4 кБ момент-убакыт алкагы 1 MB 114,2 кБ
Полифиллде тарыхта эстутумду колдонууга байланыштуу айрым аткаруу көйгөйлөрү болгон жана жазуу учурунда ал альфа абалында деп эсептелет. Ушундан улам, ал жетилген абалга жеткенге чейин аны өндүрүштө колдонгуңуз келбеши мүмкүн. Дагы бир жакшы жаңылык, полифиллге көп убакыт талап кылынбайт деп үмүттөнөбүз (албетте, эски браузерлерди колдоо керек болбосо). Жазуу учурунда, Temporal Chrome, Edge жана Firefox менен жөнөтүлгөн. Ал Safariде азырынча даяр эмес, бирок ал акыркы Технологияларды алдын ала кароодо иштөө убактысынын желеги менен жеткиликтүү окшойт.