JavaScript тілінде жазылған қолданбалардың кез келген дерлік түрі белгілі бір деңгейде уақыт немесе күндермен жұмыс істейді. Бастапқыда бұл кірістірілген Date API-мен шектелді. Бұл API негізгі функционалдылықты қамтиды, бірақ оның жасай алатын мүмкіндіктері шектеулі. Moment.js сияқты үшінші тарап кітапханалары және кейінірек Intl API және жаңа Temporal API сияқты ендірілген API интерфейстері уақыт пен күнмен жұмыс істеуге әлдеқайда икемділік қосады. Моменттің көтерілуі мен құлдырауы.js Moment.js – уақыт пен күнмен жұмыс істеуге арналған қуатты утилиталары бар JavaScript кітапханасы. Ол негізгі Date API қолданбасының уақыт белдеуін өңдеу сияқты жетіспейтін мүмкіндіктерін қамтиды және көптеген жалпы әрекеттерді жеңілдетеді. Moment сонымен қатар күндер мен уақыттарды пішімдеуге арналған функцияларды қамтиды. Ол әртүрлі қолданбаларда кеңінен қолданылатын кітапханаға айналды. Дегенмен, «Моменттің» де өз үлесі болды. Бұл үлкен кітапхана және қолданба пакетінің өлшемін айтарлықтай қоса алады. Кітапхана ағаш шайқауды қолдамайтындықтан (кітапханалардың пайдаланылмаған бөліктерін жоя алатын заманауи жинақтаушылардың мүмкіндігі), оның бір немесе екі функциясын ғана пайдалансаңыз да, бүкіл Moment кітапханасы қосылады. Moment-ке қатысты тағы бір мәселе - ол жасайтын нысандардың өзгермелі болуы. Moment нысанында белгілі бір функцияларды шақыру жанама әсерлері бар және сол нысанның мәнін өзгертеді. Бұл күтпеген мінез-құлыққа немесе қателерге әкелуі мүмкін. 2020 жылы Moment қолдаушылары кітапхананы техникалық қызмет көрсету режиміне көшіру туралы шешім қабылдады. Ешқандай жаңа мүмкіндік әзірленбейді және қолдаушылар оны жаңа жобалар үшін пайдаланбауды ұсынады. Басқа JavaScript күн кітапханалары бар, мысалы, date-fns, бірақ қалада жаңа ойнатқыш бар, API тікелей JavaScript ішіне орнатылған: Уақытша. Бұл бастапқы Date API саңылауларын толтыратын, сондай-ақ Moment және басқа кітапханалардағы кейбір шектеулерді шешетін жаңа стандарт. Уақытша дегеніміз не? Уақытша — заманауи JavaScript-ті анықтайтын ECMAScript стандартына қосылатын жаңа уақыт пен күн API интерфейсі. 20266 жылдың наурыз айындағы жағдай бойынша ол TC39 процесінің 4 кезеңіне (JavaScript тіліне ұсыныстар мен толықтыруларды қадағалайтын комитет) жетті және ECMAScript спецификациясының келесі нұсқасына қосылады. Ол қазірдің өзінде бірнеше браузерлерде іске асырылды: Chrome 144+ және Firefox 139+, Safari жақын арада жалғасады деп күтілуде. Сондай-ақ polyfill қолдау көрсетілмейтін браузерлер мен Node.js үшін қол жетімді. Уақытша API жалпы уақытта уақытты көрсететін нысандарды жасайды. Бұл берілген уақыт белдеуіндегі толық уақыт және күн белгілері болуы мүмкін немесе олар ешқандай уақыт белдеуі немесе күн туралы ақпаратсыз «қабырға сағаты» уақытының жалпы данасы болуы мүмкін. Уақытшаның кейбір негізгі ерекшеліктеріне мыналар жатады:
Күндері бар немесе жоқ уақыттар. Уақытша нысан белгілі бір күндегі нақты уақытты немесе ешқандай күн ақпараты жоқ уақытты көрсете алады. Уақытсыз белгілі бір күн де ұсынылуы мүмкін. Уақыт белдеуін қолдау. Уақытша нысандар толық уақыт белдеуі туралы хабардар және әртүрлі уақыт белдеулері бойынша түрлендіруге болады. Moment уақыт белдеулерін де қолдайды, бірақ ол қосымша уақыт белдеуінің кітапханасын қажет етеді. Өзгермейтіндік. Уақытша нысан жасалғаннан кейін оны өзгерту мүмкін емес. Уақыт арифметикасы немесе уақыт белдеуі түрлендірулері негізгі нысанды өзгертпейді. Оның орнына олар жаңа Уақытша нысанды жасайды. 1-негізделген индекстеу. Date API (сонымен қатар Moment) бар қателердің жалпы көзі айлар нөлдік индекстелген болып табылады. Бұл дегеніміз, бәріміз нақты өмірде түсінетініміздей, қаңтар 1 ай емес, 0 ай. Уақытша мұны 1-негізделген индекстеу арқылы түзетеді — қаңтар - 1 ай. Ол браузерге ендірілген. Уақытша браузердің өзінде API болғандықтан, ол қолданбаңыздың бума өлшеміне ештеңе қоспайды.
Date API жойылмайтынын да ескеру маңызды. Уақытша бұл 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('АА/КК/ЖЖЖЖ сс:мм:сс а')); // 19.02.2026 02:27:07
Moment туралы есте сақтау керек ең маңызды нәрсе - Moment нысаны әрқашан уақыт пен күн туралы ақпаратты қамтиды. Егер сізге тек уақыт туралы ақпаратпен жұмыс істеу қажет болса, бұл әдетте жақсы, бірақ бұл күн уақытты есептеуге әсер ететін жазғы уақыт немесе кібісе жылдар сияқты жағдайларда күтпеген әрекетті тудыруы мүмкін. Уақытша икемді. Temporal.Instant нысанын жасау арқылы ағымдағы күн мен уақытты көрсететін нысанды жасауға болады. Бұл «дәуірден» (1970 жылғы 1 қаңтардағы UTC түн ортасы) бергі уақытпен анықталған уақыт нүктесін білдіреді. Уақытша бұл сәтті наносекунд деңгейіндегі дәлдікпен уақытында сілтеме жасай алады. const now = Temporal.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
Temporal.Instant нысандарын белгілі бір уақыт пен күн үшін from static әдісі арқылы жасауға болады.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Жергілікті уақыт белдеуінде лездік пішімдеу. Бұл тек басқаратынын ескеріңіз // пішімдеу - moment.utc сияқты нысанды мутацияламайды. console.log(myInstant.toString({уақыт белдеуі: 'America/New_York' })); // 2026-02-18Т21: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.02.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 пішімделген күн жолынсыз шақырылса (қажетті пішімі бар екінші аргумент берілмесе) көрнекті ескіру ескертуін көрсетеді. Уақытша тек арнайы пішімделген күн жолын талдайды. Жол 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.02.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 емес жолдарды өңдеу Уақытша сенімділікке басымдық беретіндіктен, ол 02-01-2026 сияқты жолдың пішімін табуға тырыспайды. Деректер көзіңіз осындай жолдарды пайдаланса, оны Уақытша пайдалану әрекетінен бұрын мәндерді 2026-02-01 сияқты ISO жолына қайта реттеу үшін жолды өңдеу қажет болады.
Пішімдеу Сізде Moment немесе Temporal нысаны болғаннан кейін, сіз оны белгілі бір уақытта пішімделген жолға түрлендіруді қалауыңыз мүмкін. Бұл Moment сәл қысқартылған мысал. Сіз нысанның пішім әдісін қажетті күн пішімін сипаттайтын белгілер тізбегі арқылы шақырасыз. const date = moment();
console.log(date.format('АА/КК/ЖЖЖЖ')); // 22.02.2026 ж
console.log(date.format('MMMM Do YYYY, h:dd:ss a')); // 22 ақпан 2026 жыл, 20:18:30
Екінші жағынан, Уақытша сізден біршама егжей-тегжейлі болуды талап етеді. 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 ж
Moment пішімдеу таңбалауыштарын жазу оңайырақ, бірақ олар тілге сәйкес келмейді. Пішім ай/күн тәртібі сияқты «қатты кодты» жолдайды. 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, '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, 'күн');
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(күн 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');
// largeUnit көрсету үшін уақыттың ең үлкен бірлігін анықтайды // ұзақтығын есептеуде const diff = date2.sect(date1, {ең үлкенБірлік: 'күн'});
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(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 date2 алдында келеді, сондықтан -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.02.2026, 20:12:02 EST
// Тынық мұхиты уақытына түрлендіру const nowPacific = now.withTimeZone('Америка/Лос_Анджелес'); 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:dd:ss a z';
// 1. Пайдаланушының уақыт белдеуінде бастапқы сәтті жасаңыз const eventTime = moment.tz( inputString, moment.ISO_8601, // ISO 8601 жолын күту шын, // Қатаң талдау userTimeZone );
// Егер inputString жарамды күнді көрсетпесе, қате жіберіңіз егер (!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(schedule.target); // 2026 жылғы 5 наурыз, GMT 20:00:00
Бұл мысалда біз Moment ішіне пайдалы түрде енгізілген 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); // 2026 жылғы 5 наурыз, EST 15:00:00
console.log(schedule.target); // 2026 жылғы 5 наурыз, GMT уақытымен 20:00:00
Moment көмегімен біз нәтижелі күн жолдары үшін пішім жолын нақты көрсетуіміз керек. Пайдаланушының орналасқан жеріне немесе тіліне қарамастан, оқиға уақыты әрқашан 2026 жылдың 5 наурызы, 3:00:00 ретінде пішімделеді.кешкі сағат EST. Сондай-ақ, біз ерекше жағдайды нақты түрде шығарудың қажеті жоқ. Жарамсыз жол Temporal.Instant.from файлына берілсе, Temporal біз үшін ерекше жағдайды шығарады. Айта кететін бір жайт, тіпті қатаң талдаумен Moment нұсқасы бұрынғысынша жұмсақ. Уақытша жолдың соңында уақыт белдеуінің ығысуын талап етеді. Сондай-ақ, біз navigator.language пайдаланатындықтан, бұл код тек шолғыш ортасында жұмыс істейтінін ескеру қажет, өйткені навигатор Node.js ортасында анықталмаған. Уақытша енгізу браузердің ағымдағы тілін (navigator.language) пайдаланады, осылайша пайдаланушы жергілікті уақыт пішімінде пішімделген оқиға уақыттарын автоматты түрде алады. АҚШ-тағы жергілікті тілде бұл 2026 жылдың 5 наурызы, EST 15:00:00. Дегенмен, егер пайдаланушы Лондонда болса, мысалы, оқиға уақыты 2026 жылдың 5 наурызы, 15:00:00 GMT-5 ретінде пішімделеді. Түйіндеме
Әрекет Moment.js Уақытша Ағымдағы уақыт сәт() Temporal.Now.zonedDateTimeISO() ISO талдауы сәт(стр) Temporal.Instant.from(str) Уақыт қосыңыз .add(7, 'күн') (мутациялар) .add({ күн: 7 }) (жаңа нысан) Айырмашылық .diff(басқа, 'сағат') .бері(басқа).сағат Уақыт белдеуі .tz('Аймақ/Атау') .withTimeZone('Аймақ/Атау')
Бір қарағанда, айырмашылық сәл өзгеше болуы мүмкін (және Уақытша, кейде неғұрлым егжей-тегжейлі және қатаңырақ) синтаксис, бірақ Moment.js-ге қарағанда Temporal пайдаланудың бірнеше негізгі артықшылықтары бар:
Неғұрлым анық болу тосынсыйлар мен күтпеген қателерді азайтуды білдіреді. Сәт жұмсақ болып көрінуі мүмкін, бірақ ол кейде қате күндерге әкелуі мүмкін «болжамды» қамтиды. Уақытшаға жарамсыз нәрсе берсеңіз, ол қате жібереді. Егер код іске қосылса, сізде жарамды күн бар екенін білесіз. Момент қолданбалар жинағына айтарлықтай өлшем қосуы мүмкін, әсіресе уақыт белдеуі пакетін пайдалансаңыз. Уақытша ештеңе қоспайды (ол мақсатты браузерлеріңізге жіберілгеннен кейін). Өзгермейтіндік сізге күнді түрлендіру мен операцияларды орындау кезінде деректерді ешқашан жоғалтпайтыныңызға немесе қайта жазбайтыныңызға сенімділік береді. Талаптарыңызға байланысты уақыттың әртүрлі көріністері (Instant, PlainDateTime, ZonedDateTime), мұнда Moment әрқашан UTC уақыт белгісінің айналасындағы орауыш болып табылады. Уақытша күнді пішімдеу үшін Intl API интерфейстерін пайдаланады, яғни таңбалауыштарды нақты көрсетуді қажет етпей-ақ тілге қатысты пішімдеуге болады.
Polyfill туралы ескертпелер Бұрын айтылғандай, @js-temporal/polyfill деп аталатын npm бумасы ретінде таратылатын Уақытша политолтыр бар. Егер сіз бүгін Temporal қолданбасын пайдаланғыңыз келсе, API әлі жеткізілмеген Safari сияқты браузерлерді қолдау үшін сізге бұл политолтыр қажет болады. Мұның жаман жаңалығы - бұл сіздің топтаманың көлемін арттырады. Жақсы жаңалық, ол әлі де сәтке немесе уақыт белдеуіне қарағанда айтарлықтай азырақ қосады. Мұнда npm пакет өлшемдері туралы ақпаратты ұсынатын Bundlephobia.com веб-сайты хабарлаған пакет өлшемдерін салыстыру берілген (Bundlephobia талдауын көру үшін әрбір бума атауын басыңыз):
Пакет Кішірейтілген Шағын және gzip файлы @js-temporal/polyfill 154,1 кБ 44,1 кБ сәт 294,4 кБ 75,4 кБ сәт-уақыт белдеуі 1 МБ 114,2 кБ
Сондай-ақ, полифиллде тарихи жадты пайдалануда кейбір өнімділік мәселелері болды және жазу кезінде ол альфа күйінде болып саналады. Осыған байланысты, ол неғұрлым жетілген күйге жеткенше оны өндірісте пайдаланғыңыз келмеуі мүмкін. Тағы бір жақсы жаңалық - политолтыру ұзақ уақыт қажет болмайды деп үміттенеміз (егер ескі браузерлерді қолдау қажет болмаса). Жазу кезінде Temporal Chrome, Edge және Firefox-та жеткізілді. Ол Safari-де әлі дайын емес, бірақ ол соңғы технологияны алдын ала қарау нұсқасында орындалу уақыты жалаушасы бар сияқты.