JavaScript белән язылган теләсә нинди кушымта диярлек вакыт яки даталар белән эшли. Башта, бу урнаштырылган Дата API белән чикләнде. Бу API төп функцияне үз эченә ала, ләкин ул эшли алырлык чикләнгән. Moment.js кебек өченче як китапханәләр, һәм соңрак Intl APIs һәм яңа Temporal API кебек урнаштырылган API-лар вакыт һәм даталар белән эшләүгә күпкә зуррак сыгылмалар өстиләр. Моментның күтәрелүе һәм төшүе Moment.js - вакыт һәм даталар белән эшләү өчен көчле инженерлыклы JavaScript китапханәсе. Бу төп Дата API-ның югалган үзенчәлекләрен үз эченә ала, мәсәлән, вакыт зонасы манипуляциясе, һәм күп уртак операцияләрне гадиләштерә. Момент шулай ук даталарны һәм вакытларны форматлау функцияләрен үз эченә ала. Ул күп төрле кушымталарда киң кулланылган китапханәгә әйләнде. Шулай да, Моментның проблемаларның өлеше дә бар иде. Бу зур китапханә, һәм кушымталарның зурлыгына зур өлеш кертә ала. Китапханә агач селкенүен хупламаганга (китапханәләрнең кулланылмаган өлешләрен бетерә ала торган заманча бундерларның үзенчәлеге), сез аның бер-ике функциясен генә куллансагыз да, бөтен Момент китапханәсе кертелгән. Момент белән тагын бер проблема - ул тудырган әйберләрнең үзгәрүчән булуы. Момент объектында кайбер функцияләрне чакыру начар йогынты ясый һәм бу объектның кыйммәтен үзгәртә. Бу көтелмәгән тәртипкә яки хаталарга китерергә мөмкин. 2020-нче елда Моментны саклаучылар китапханәне хезмәт күрсәтү режимына куярга булдылар. Яңа функцияләр эшләнми, һәм саклаучылар аны яңа проектларда кулланмаска киңәш итәләр. Башка JavaScript дата китапханәләре бар, мәсәлән, date-fns, ләкин шәһәрдә яңа плеер бар, турыдан-туры JavaScript эчендә төзелгән API: Вакытлыча. Бу яңа стандарт, оригиналь Date API тишекләрен тутыра, шулай ук Моментта һәм бүтән китапханәләрдә булган кайбер чикләүләрне чишә. Вакытлы нәрсә ул? Вакытлыча - заманча JavaScriptны билгеләүче ECMAScript стандартына өстәлгән яңа вакыт һәм дата API. 20266 елның мартына ул TC39 процессының 4 этабына җитте (JavaScript теленә тәкъдимнәр һәм өстәмәләр белән идарә итүче комитет), һәм ECMAScript спецификациясенең киләсе версиясенә кертеләчәк. Бу инде берничә браузерда тормышка ашырылды: Chrome 144+ һәм Firefox 139+, тиздән Safari иярер дип көтелә. Полифилл шулай ук ярдәм ителмәгән браузерлар һәм Node.js. өчен бар. Вакытлы API объектларны барлыкка китерә, алар, гадәттә, мизгелләрне күрсәтәләр. Бу билгеле бер вакыт зонасында тулы вакытлы һәм дата маркалары булырга мөмкин, яисә алар "стена сәгате" вакытының гомуми мисалы булырга мөмкин. Вакытлыча кайбер төп үзенчәлекләр:
Даталар белән яки булмаган вакытлар. Вакытлы объект билгеле бер датада билгеле бер вакытны, яки дата турында мәгълүматсыз вакытны күрсәтә ала. Билгеле дата, вакытсыз, шулай ук күрсәтелергә мөмкин. Вакыт зонасы ярдәме. Темпораль объектлар тулы вакыт зонасын беләләр һәм төрле вакыт зоналарында үзгәртелергә мөмкин. Момент вакыт зоналарын да хуплый, ләкин бу өстәмә мизгел зонасы китапханәсен таләп итә. Иммутация. Вакытлы объект барлыкка килгәч, аны үзгәртеп булмый. Вакыт арифметик яки вакыт зонасын үзгәртү төп объектны үзгәртми. Киресенчә, алар яңа Вакытлы объект ясыйлар. 1-нигезләнгән индексация. Дата API белән (шулай ук Момент белән) хаталарның гомуми чыганагы - айлар нуль-индексацияләнгән. Димәк, гыйнвар - 1 ай түгел, ә 0 ай, без барыбыз да реаль тормышта аңлыйбыз. Вакытлыча моны 1 нигезләнгән индексация ярдәмендә төзәтәләр - гыйнвар - 1 ай. Ул браузерга салынган. Темпораль браузерның үзендә API булганлыктан, ул сезнең кушымтагызның зурлыгына бернәрсә дә өстәми.
Шунысын да әйтергә кирәк, Дата API китми. Вакытлыча бу API-ны алыштырса да, ул бетерелми һәм искерми. Браузерлар Дата API кинәт бетерелсә, күп кушымталар өзелер иде. Ләкин шулай ук онытмагыз, Момент хәзер хезмәт күрсәтү режимында мирас проекты булып санала. Мәкаләнең калган өлешендә без моментка нигезләнгән кодны яңа Temporal API'ка күчерү өчен кайбер "рецептларны" карыйбыз. Рефакторингны башлыйк! Дата һәм Вакыт объектларын булдыру Даталарны һәм вакытларны манипуляцияләгәнче, без аларны күрсәтүче әйберләр ясарга тиеш. Хәзерге датаны һәм вакытны күрсәтүче Момент объектын булдыру өчен, момент функциясен кулланыгыз. const хәзер = мизгел (); console.log (хәзер); // Момент <2026-02-18T21: 26: 29-05: 00>
Бу объект хәзер форматланырга яки кирәк булганда эшкәртелергә мөмкин.
// UTC'ка әйләндерү //кисәтү: Бу Момент объектын мутацияли һәм UTC режимына куя! console.log (now.utc ()); // Момент <2026-02-19T02: 26: 29Z>
// форматланган сызыкны бастырыгыз - ул хәзер UTC вакытын куллана console.log (now.format ('MM / DD / YYYY hh: mm: ss a')); // 02/19/2026 02:27:07
Момент турында истә калдырырлык төп нәрсә - Момент объектында һәрвакыт вакыт һәм дата турында мәгълүмат бар. Әгәр дә сез вакыт турында мәгълүмат белән эшләргә тиеш булсагыз, бу гадәттә яхшы, ләкин ул Көн яктылыгын саклау яки сикерү еллары кебек ситуацияләрдә көтелмәгән тәртип тудырырга мөмкин, анда дата вакыт исәпләүләренә тәэсир итә ала. Вакытлыча сыгылучан. Сез хәзерге датаны һәм вакытны күрсәтүче объект булдыра аласыз, Temporal.Instant объект. Бу "чор" дан (1970 елның 1 гыйнварында төн уртасы) билгеләнгән вакытны күрсәтә. Вакытлыча бу мизгелне наносекунд дәрәҗәсендәге төгәллек белән күрсәтә ала. const хәзер = Вакытлы.Now.instant ();
// чоры наносекундларын карагыз console.log (now.epochNanoseconds); // 1771466342612000000н
// 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
Вакытлы. Эчтәлекле әйберләр статик ысул ярдәмендә билгеле бер вакыт һәм дата өчен дә ясалырга мөмкин.
const myInstant = Temporal.Instant.from ('2026-02-18T21: 10: 00-05: 00');
// localирле вакыт зонасында мизгелне форматлагыз. Игътибар итегез, бу идарә итә // форматлау - ул moment.utc кебек объектны мутацияләми. console.log (myInstant.toString ({timeZone: 'Америка / Нью_ Йорк'})); // 2026-02-18T21: 10: 00-05: 00
Сез шулай ук Вакытлы объектларның башка төрләрен булдыра аласыз, шул исәптән:
Temporal.PlainDate: Вакыт мәгълүматы булмаган дата. Temporal.PlainTime: Дата турында мәгълүмат булмаган вакыт. Temporal.ZonedDateTime: билгеле бер вакыт зонасында дата һәм вакыт.
Аларның һәрберсендә датаны һәм / яки вакытны күрсәтүче объект белән шалтыратырга мөмкин булган методтан, яки анализлау өчен дата сызыгы бар. // Дата const бүген = Temporal.PlainDate.from ({ ел: 2026, ай: 2, // искәрмә без февраль өчен 2 кулланабыз көн: 18 }); console.log (бүген.тоСтринг ()); // 2026-02-18
// Бер вакыт const төшке аш вакыты = Вакытлыча.PlainTime.from ({ сәгать: 12 }); console.log (төшке аш вакыты.тоСтринг ()); // 12:00:00
// АКШ Көнчыгыш вакыт зонасында дата һәм вакыт const dueAt = Temporal.ZonedDateTime.from ({ timeZone: 'Америка / Нью_ Йорк', ел: 2026, ай: 3, көн: 1, сәгать: 12, минут: 0, икенче: 0 }); console.log (dueAt.toString ()); // 2026-03-01T12: 00: 00-05: 00 [Америка / Нью_ Йорк]
Парсинг Без дата һәм вакыт мәгълүматының программалы ясалышын яктырттык. Хәзер анализлауны карыйк. Парсинг - Момент урнаштырылган Temporal API белән чагыштырганда сыгылучан бер өлкә. Дата сызыгын момент функциясенә күчереп анализлый аласыз. Бер аргумент белән, Момент ISO датасын көтә, ләкин кулланыла торган дата форматын күрсәтүче икенче аргумент тәкъдим итсәгез, альтернатив форматларны куллана аласыз.
const isoDate = момент ('2026-02-21T09: 00: 00'); const форматланган Дата = момент ('2/21/26 9:00:00', 'M / D / YY h: mm: ss');
console.log (isoDate); // Момент <2026-02-21T09: 00: 00-05: 00>
console.log (форматланган Дата); // Момент <2026-02-21T09: 00: 00-05: 00>
Иске версияләрдә, Момент теләсә нинди форматланган дата сызыгын анализлау өчен иң яхшы фараз ясар иде. Бу көтелмәгән нәтиҗәләргә китерергә мөмкин. Мәсәлән, 02-03-2026 2 февральме яки 3 мартмы? Шул сәбәпле, Моментның яңа версияләре ISO форматланган дата сызыгы булмаса (кирәкле форматтагы икенче аргумент та бирелмәгән булса) күренекле искерү турында кисәтә. Вакытлыча махсус форматланган дата сызыгын анализлаячаклар. Сызык ISO 8601 форматына яки аның киңәйтелүенә туры килергә тиеш, RFC 9557. Әгәр туры килмәгән дата сызыгы методка күчерелсә, Temporal RangeError ыргытачак.
// RFC 9557 дата сызыгын куллану const myDate = Temporal.Instant.from ('2026-02-21T09: 00: 00-05: 00 [Америка / Нью_ Йорк]'); console.log (myDate.toString ({timeZone: 'Америка / Нью_ Йорк'})); // 2026-02-21T09: 00: 00-05: 00
// Билгесез дата сызыгын куллану const otherDate = Temporal.Instant.from ('2/21/26 9:00:00'); // RangeError: Вакытлы хата: Ел кыйммәтен анализлаганда дөрес булмаган символ.
Дата сызыгының төгәл таләпләре сез нинди Вакытлы объект ясавыгызга бәйле. Aboveгарыдагы мисалда 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 булмаган сызыкларны эшкәртү Чөнки вакытлыча ышанычлылык өстенлек итә, ул 02-01-2026 кебек тезмә форматын чамаламаска. Әгәр дә сезнең мәгълүмат чыганагыгыз мондый сызыкларны кулланса, сезгә вакытлыча кулланырга тырышканчы, 2026-02-01 кебек ISO сызыгына кыйммәтләрне тәртипкә китерү өчен сезгә берничә манипуляция ясарга кирәк.
Форматлау Сездә Момент яки Вакытлы объект булганда, сез аны, мөгаен, форматланган сызыкка әйләндерергә теләрсез. Бу момент бераз күбрәк булган очрак. Сез объектның формат ысулын кирәкле дата форматын тасвирлаучы билгеләр тезмәсе белән атыйсыз. const датасы = момент ();
console.log (date.format ('MM / DD / YYYY')); // 02/22/2026
console.log (date.format ('MMMM Do YYYY, h: mm: ss a')); // 2026 елның 22 феврале, 8:18:30
Икенче яктан, Вакытлыча сездән бераз күбрәк сүзле булуыгызны таләп итә. Вакытлы объектлар, мәсәлән, Instant, toLocaleString ысулы бар, ул объектның үзенчәлекләре итеп күрсәтелгән төрле форматлау вариантларын кабул итә.
const датасы = Вакытлы.Нов.инстант ();
// аргументларсыз, без хәзерге локаль өчен килешү форматын алырбыз console.log (date.toLocaleString ()); // 2/22/2026, 8:23:36 PM (en-US җирлеген фаразлау)
// махсус формат сызыгы ясау өчен форматлау вариантларын узыгыз console.log (date.toLocaleString ('en-US', {) ай: 'озын', көн: 'санлы', ел: 'сан', сәгать: '2 санлы', минут: '2 санлы' })); // 2026, 22 февраль, 8:23
// формат сызыгында сез теләгән кырларны гына узыгыз console.log (date.toLocaleString ('en-US', {) ай: 'кыска', көн: 'санлы' })); // 22 февраль
Вакытлы дата форматлау чынлыкта Intl.DateTimeFormat API куллана (ул хәзерге браузерларда бик җиңел). Димәк, сез үзегезнең форматлау параметрлары белән кабат кулланыла торган DateTimeFormat объектын булдыра аласыз, аннары Вакытлы объектларны аның формат ысулына күчерә аласыз. Шуңа күрә, ул Момент кебек махсус дата форматларын хупламый. Сезгә 'Q1 2026' яки башка махсус форматлау кебек әйберләр кирәк булса, сезгә берәр махсус дата форматлау коды кирәк булырга яки өченче як китапханәгә барып җитәргә мөмкин. const форматоры = яңа Intl.DateTimeFormat ('en-US', { ай: '2 санлы', көн: '2 санлы', ел: 'сан' });
const датасы = Вакытлы.Нов.инстант (); console.log (formatter.format (дата)); // 02/22/2026
Моментның форматлау билгеләрен язу гадирәк, ләкин алар җирле түгел. Формат "каты код" әйберләрен ай / көн тәртибе кебек тезә. Конфигурация объектын куллануның өстенлеге, Темпораль кебек, ул теләсә нинди җирлеккә автоматик рәвештә яраклашачак һәм дөрес форматны куллана. const датасы = Вакытлы.Нов.инстант ();
const formatOptions = { ай: 'сан', көн: 'санлы', ел: 'сан' };
console.log (date.toLocaleString ('en-US', formatOptions)); // 2/22/2026
console.log (date.toLocaleString ('en-GB', formatOptions)); // 22/02/2026
Дата исәпләүләре Күпчелек кушымталарда сезгә бер көн эчендә кайбер исәпләүләрне башкарырга кирәк. Сез вакыт берәмлекләрен (көннәр, сәгатьләр, секундлар һ.б.) өстәргә яки алырга телисез. Әйтик, сезнең хәзерге датагыз булса, сез кулланучыга датаны 1 атнадан күрсәтергә теләрсез. Момент объектларда бу операцияләрне башкаручы өстәү һәм алу кебек ысуллар бар. Бу функцияләр кыйммәт һәм берәмлек ала, мәсәлән: өстәргә (7, 'көн'). Момент һәм Темпораль арасында бик мөһим аерма, ләкин, бу дата исәпләүләрен башкарганда, төп объект үзгәртелә һәм аның оригиналь кыйммәте юкка чыга. const хәзер = мизгел ();
console.log (хәзер); // Момент <2026-02-24T20: 08: 36-05: 00>
const nextWeek = now.add (7, 'көн'); console.log (nextWeek); // Момент <2026-03-03T20: 08: 36-05: 00>
// Готча - оригиналь объект мутацияләнде console.log (хәзер); // Момент <2026-03-03T20: 08: 36-05: 00>
Оригиналь датаны югалтмас өчен, күчермә ясау өчен Момент объектындагы клонга шалтырата аласыз. const= мизгел (); const nextWeek = now.clone (). өстәргә (7, 'көн');
console.log (хәзер); // Момент <2026-02-24T20: 12: 55-05: 00>
console.log (nextWeek); // Момент <2026-03-03T20: 12: 55-05: 00>
Икенче яктан, вакытлы әйберләр үзгәрмәс. Бер мизгел, PlainDate һ.б. кебек объект булдырганнан соң, бу объектның бәясе беркайчан да үзгәрмәячәк. Вакытлы объектларның өстәү һәм алу ысуллары да бар. Кайсы объект төрләренә кайсы вакыт берәмлекләрен өстәп була икәне турында вакытлыча бераз сайлау. Мәсәлән, сез мизгелгә берничә көн өсти алмыйсыз:
const хәзер = Вакытлы.Now.instant (); const nextWeek = now.add ({көннәр: 7}); // RangeError: Вакытлы хата: Иң зур берәмлек дата берәмлеге була алмый
Чөнки мизгел объектлары UTC вакытында билгеле бер ноктаны күрсәтәләр һәм календарь-агностик. Көн озынлыгы вакыт зонасы кагыйдәләренә нигезләнеп үзгәрә ала, чөнки Көн яктысын саклау вакыты, бу исәпләү тиз арада мөмкин түгел. Сез бу операцияне башка төр объектларда башкара аласыз, мәсәлән, PlainDateTime: const хәзер = Temporal.Now.plainDateTimeISO (); console.log (now.toLocaleString ()); // 2/24/2026, 8:23:59
const nextWeek = now.add ({көннәр: 7});
// Игътибар итегез, PlainDateTime оригиналь үзгәрешсез кала console.log (now.toLocaleString ()); // 2/24/2026, 8:23:59
console.log (nextWeek.toLocaleString ()); // 3/3/2026, 8:23:59
Сез шулай ук ике момент яки вакытлы әйберләр арасында күпме вакыт барлыгын исәпли аласыз. Моментның дифф функциясе белән сез гранулитика өчен берәмлек бирергә тиеш, югыйсә ул миллисекундтагы аерманы кайтарыр. const дата1 = момент ('2026-02-21T09: 00: 00'); const дата2 = момент ('2026-02-22T10: 30: 00');
console.log (date2.diff (дата1)); // 91800000
console.log (date2.diff (дата1, 'көннәр')); // 1
Моны Вакытлы объект белән башкару өчен, сез бүтән Вакытлы объектны методларга кадәр яисә аннан соң күчерә аласыз. Бу Вакыт аермасы турында мәгълүматны үз эченә алган Temporal.Duration объектын кире кайтара. Озаклык объекты аерманың һәр компоненты өчен үзенчәлекләргә ия, һәм шулай ук вакыт аермасын күрсәтүче ISO 8601 озынлык сызыгы ясый ала.
const date1 = Temporal.PlainDateTime.from ('2026-02-21T09: 00: 00'); const date2 = Temporal.PlainDateTime.from ('2026-02-22T10: 30: 00');
// largestUnit күрсәтү өчен иң зур вакыт берәмлеген күрсәтә // озынлыкны исәпләүдә const diff = date2.since (дата1, {иң зурUnit: 'көн'});
console.log (diff.days); // 1
console.log (diff.hours); // 1
console.log (diff.minutes); // 30
console.log (diff.toString ()); // P1DT1H30M // (ISO 8601 озынлыгы: 1 көн, 1 сәгать, 30 минут)
Даталарны һәм вакытларны чагыштыру Момент һәм Вакытлы икесе дә сезгә икенчесен алдан билгеләр өчен даталарны һәм вакытларны чагыштырырга рөхсәт итәләр, ләкин API белән төрле карашлар алыгыз. Момент ике момент объектны чагыштыру өчен isBefore, isAfter кебек ысуллар белән тәэмин итә. const дата1 = момент ('2026-02-21T09: 00: 00'); const дата2 = момент ('2026-02-22T10: 30: 00');
console.log (date1.isBefore (дата2)); // дөрес
Вакытлыча бер үк типтагы ике объект арасында чагыштыру ясау өчен статик чагыштыру ысулы кулланыла. Беренче дата икенчесенә кадәр килсә -1 кайта, алар тигез булса 0, яки беренче дата икенчесеннән соң килсә. Түбәндәге мисал ике 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 даталары = [...];
// чагыштыручы функция буларак Temporal.PlainDate.compare кулланыгыз даталар.сорт (Temporal.PlainDate.compare);
Вакыт зонасын үзгәртү Төп момент китапханәсе вакыт зонасын үзгәртүгә булышмый. Сезгә бу функция кирәк булса, сезгә момент-вакыт зонасын урнаштырырга кирәк. Бу пакет агачны селкетеп тормый, шуңа күрә сезнең бәйләнеш зурлыгына зур өлеш кертә ала. Момент-вакыт зонасын урнаштыргач, сез момент объектларын tz ысулы белән төрле вакыт зоналарына әйләндерә аласыз. Башка Момент операцияләрендәге кебек, бу да төпне мутациялиобъект. // АКШның Көнчыгыш вакытын фаразлау const хәзер = мизгел (); console.log (хәзер); // Момент <2026-02-28T20: 08: 20-05: 00>
// Тын океан вакытына күчү. // Көнчыгышның оригиналь вакыты юкка чыга. now.tz ('Америка / Los_Angeles'); console.log (хәзер); // Момент <2026-02-28T17: 08: 20-08: 00>
Вакыт зонасы функциональлеге Temporal.ZonedDateTime объектын кулланганда Temporal API эчендә төзелгән. Бу объектларга шул ук мизгелне күрсәтүче, ләкин күрсәтелгән вакыт зонасында яңа ZonedDateTime кайтаручыTimeZone ысулы керә. // Тагын, АКШның Көнчыгыш вакытын күздә тотып const хәзер = Temporal.Now.zonedDateTimeISO (); console.log (now.toLocaleString ()); // 2/28/2026, 8:12:02 PM EST
// Тын океан вакытына күчү const nowPacific = now.withTimeZone ('Америка / Los_Angeles'); console.log (nowPacific.toLocaleString ()); // 2/28/2026, 5:12:02 PM PST
// Оригиналь объект үзгәрешсез кала console.log (now.toLocaleString ()); // 2/28/2026, 8:12:02 PM EST
Искәрмә :LocaleString белән кайтарылган форматланган кыйммәтләр, исеменнән күренгәнчә, җирлегә бәйле. Codeрнәк коды АКШ-ның җирлегендә эшләнде, шуңа күрә формат шундый: 28/2/2026, 5:12:02 PM PST. Башка җирдә бу төрле булырга мөмкин. Мәсәлән, en-GB җирлегендә сез 28/2/2026, 17:12:02 GMT-8 кебек әйберләр алыр идегез. Чын дөнья рефакторы Әйтик, без вакыт зоналары буенча вакыйгаларны планлаштыру өчен кушымта төзибез. Бу кушымтаның өлеше getEventTimes функциясе, ул вакыйганың вакытын һәм датасын, җирле вакыт зонасын һәм максатчан вакыт зонасын күрсәтүче ISO 8601 сызыгын ала. Функция ике вакыт зонасында да вакыйга өчен форматланган вакыт һәм дата сызыкларын ясый. Әгәр функциягә вакыт / дата сызыгы булмаган кертү сызыгы бирелсә, ул хата җибәрәчәк. Менә оригиналь куллану, моментны куллану (шулай ук момент-вакыт зонасы пакетын куллануны таләп итә).
"момент-вакыт зонасыннан" импорт кертү;
getEventTimes функциясе (inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h: mm: ss a z';
// 1. Кулланучының вакыт зонасында беренче мизгелне булдырыгыз const eventTime = moment.tz ( inputString, мизгел.ISO_8601, // ISO 8601 юлын көтегез дөрес, // Каты анализ userTimeZone );
// inputString дөрес датаны күрсәтмәсә, хата ташлагыз if (! eventTime.isValid ()) { яңа Хата ташлау ('Яраксыз дата / вакыт кертү'); }
// 2. Максат вакытын исәпләгез // Тәнкыйть: Без клонлаштырырга тиеш, яисә 'вакыйга вакыты' мәңгегә үзгәрергә тиеш! const targetTime = eventTime.clone (). tz (targetTimeZone);
кайту { җирле: вакыйгаTime.format (timeFormat), максат: targetTime.format (timeFormat), }; }
const расписаниесе = getEventTimes ( '2026-03-05T15: 00-05: 00', 'Америка / Нью_ Йорк', 'Европа / Лондон', );
console.log (график.локаль); // 5 март, 2026, 15.00 сәгатьтә EST
console.log (график.таргет); // 5 март, 2026, GMT 8.00
Бу мисалда без ISO 8601 көтелгән дата форматын кулланабыз, ул Моментка ярдәм итеп төзелгән. Без шулай ук каты анализлау кулланабыз, димәк, Момент форматка туры килмәгән дата сызыгы белән чамаламаска тиеш. Әгәр дә ISO булмаган дата сызыгы узса, ул дата объектының яраксызлыгына китерәчәк, һәм без хата җибәрәбез. Вакытлыча тормышка ашыру охшаш, ләкин берничә төп аерма бар.
getEventTimes функциясе (inputString, userTimeZone, targetTimeZone) { // 1. Керүне турыдан-туры мизгелгә бүлегез, аннары булдырыгыз // кулланучы зонасында ZonedDateTime. const мизгел = 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 (график.локаль); // 5 март, 2026, 3:00:00 EST
console.log (график.таргет); // 5 март, 2026, 8:00:00 GMT GMT
Момент ярдәмендә без килеп чыккан дата сызыклары өчен формат сызыгын ачык күрсәтергә тиеш. Кулланучының урнашкан урынына яки җирлегенә карамастан, вакыйга вакыты һәрвакыт 5 март, 2026, 3:00:00 форматланачак.кич EST. Шулай ук, безгә ачыктан-ачык ташларга кирәк түгел. Әгәр дә яраксыз сызык Temporal.Instant.from'ка күчерелсә, Temporal безнең өчен искәрмәне ташлый. Әйтергә кирәк, каты анализлау белән дә, Момент версиясе тагын да йомшак. Вакытлыча тезмә ахырында вакыт зонасы офсеты таләп ителә. Сез шулай ук онытмаска тиеш, без navigator.language кулланганлыктан, бу код браузер мохитендә генә эшләячәк, чөнки Node.js мохитендә навигатор билгеләнмәгән. Вакытлыча тормышка ашыру браузерның хәзерге җирлеген куллана (navigator.language), шуңа күрә кулланучы вакыйгалар вакытын автоматик рәвештә җирле вакыт форматында алачак. АКШ-ның җирлегендә, бу 5 март, 2026, 15.00 сәгатьтә EST. Ләкин, кулланучы Лондонда булса, вакыйга вакыты 5 март 2026, 15:00:00 GMT-5 форматланачак. Аннотация
Эш Moment.js Вакытлыча Хәзерге вакыт мизгел () Temporal.Now.zonedDateTimeISO () ISO анализлау мизгел (стр.) Вакытлы.Instant.from (стр.) Вакыт өстәгез .add (7, 'көн') (мутацияләр) .add ({көннәр: 7}) (яңа объект) Аерма .диф (бүтән, 'сәгатьләр') .синс (бүтән) Вакыт зонасы .tz ('Зона / Исем') .withTimeZone ('Зона / Исем')
Беренче карашка, аерма бераз төрле булырга мөмкин (һәм Темпораль очракта, кайвакыт тагын да катырак) синтаксис, ләкин Moment.js өстендә Temporal куллануның берничә төп өстенлеге бар:
Ачыкрак булу сюрпризларның һәм уйланмаган хаталарның азрак булуын аңлата. Момент җиңелрәк булып күренергә мөмкин, ләкин ул "фаразлау" ны үз эченә ала, бу кайвакыт дөрес булмаган даталарга китерергә мөмкин. Вакытлыча берәр нәрсәне дөрес бирмәсәгез, ул хата җибәрә. Код эшләсә, сез дөрес дата алганыгызны беләсез. Момент кушымта бәйләнешенә зур күләм өсти ала, бигрәк тә сез вакыт зонасы пакетын куллансагыз. Вакытлыча бернәрсә дә өстәми (ул сезнең максатлы браузерларда җибәрелгәннән соң). Immзгәрешсезлек сезгә ышаныч бирә, сез дата конверсияләрен һәм операцияләрен башкарганда беркайчан да мәгълүматны югалтмассыз һәм өстәмә язмассыз. Вакытның төрле чагылышы (Instant, PlainDateTime, ZonedDateTime) сезнең таләпләрегезгә карап, монда Moment һәрвакыт UTC срокы тирәсендә уралган. Вакытлыча Intl API'ларын дата форматлау өчен куллана, димәк, сез билгеләрне ачык күрсәтмичә, җирле-форматлы була аласыз.
Полифилл турында искәрмәләр Алда әйтелгәнчә, @ js-temporal / polyfill исемле npm пакеты буларак таратылган Вакытлы полифилл бар. Әгәр дә сез бүген Вакытлыча кулланырга телисез икән, сезгә бу полифилл кирәк, Safari кебек браузерларга ярдәм итү өчен, әле API җибәрмәгән. Моның белән начар хәбәр - бу сезнең бәндә күләменә өстәр. Яхшы хәбәр - ул әле момент яки момент-вакыт зонасына караганда азрак өсти. Менә бундлефобия.com хәбәр иткәнчә, бланк зурлыкларын чагыштыру, npm пакет зурлыклары турында мәгълүмат тәкъдим итүче вебсайт (Бундлефобия анализын карау өчен һәр пакет исеменә басыгыз):
Пакет Минималь Минимальләштерелгән @ js-вакытлы / полифилл 154.1 кБ 44.1 кБ мизгел 294,4 кБ 75,4 кБ момент-вакыт зонасы 1 Мб 114.2 кб
Полифиллда шулай ук хәтер куллану тирәсендә кайбер эш проблемалары булган, һәм язылган вакытта ул альфа хәлендә дип санала. Шуңа күрә, сез аны җитлеккән хәлгә кадәр җитештерүдә кулланырга теләмисез. Башка яхшы хәбәр - полифиллга озаграк кирәк булмас дип өметләнәм (әлбәттә, иске браузерларга ярдәм итмәсәгез). Язу вакытында Temporal Chrome, Edge һәм Firefox'ка җибәрелгән. Бу әле Сафарида бик әзер түгел, гәрчә ул соңгы технологияне карау вакытында эш флагы белән бар кебек.