Takriban aina yoyote ya programu iliyoandikwa katika JavaScript hufanya kazi na nyakati au tarehe kwa kiwango fulani. Hapo awali, hii ilipunguzwa kwa API ya Tarehe iliyojengwa. API hii inajumuisha utendakazi wa kimsingi, lakini ni mdogo katika kile inaweza kufanya. Maktaba za watu wengine kama Moment.js, na API zilizojumuishwa baadaye kama vile API za Intl na API mpya ya Muda, huongeza unyumbufu mkubwa zaidi wa kufanya kazi kulingana na nyakati na tarehe. Kuinuka na Kushuka kwa Muda.js Moment.js ni maktaba ya JavaScript yenye huduma zenye nguvu za kufanya kazi kulingana na nyakati na tarehe. Inajumuisha vipengele vinavyokosekana kutoka kwa API ya msingi ya Tarehe, kama vile uchezaji wa saa za eneo, na hurahisisha shughuli nyingi za kawaida. Moment pia inajumuisha vitendakazi vya kupanga tarehe na nyakati. Ikawa maktaba inayotumika sana katika matumizi mengi tofauti. Walakini, Moment pia ilikuwa na sehemu yake ya maswala. Ni maktaba kubwa, na inaweza kuongeza kwa kiasi kikubwa ukubwa wa kifurushi cha programu. Kwa sababu maktaba haiauni mti kutikiswa (kipengele cha vifurushi vya kisasa vinavyoweza kuondoa sehemu ambazo hazijatumika za maktaba), maktaba yote ya Moment imejumuishwa hata ikiwa unatumia tu utendakazi wake moja au mbili. Suala jingine na Moment ni ukweli kwamba vitu inachounda vinaweza kubadilika. Kupigia simu vitendaji fulani kwenye kitu cha Moment kuna athari na hubadilisha thamani ya kitu hicho. Hii inaweza kusababisha tabia au hitilafu zisizotarajiwa. Mnamo 2020, watunzaji wa Moment waliamua kuweka maktaba katika hali ya matengenezo. Hakuna usanidi wa kipengele kipya unaofanywa, na watunzaji wanapendekeza dhidi ya kukitumia kwa miradi mipya. Kuna maktaba zingine za tarehe za JavaScript, kama vile tarehe-fns, lakini kuna kichezaji kipya mjini, API iliyojengwa moja kwa moja kwenye JavaScript: Temporal. Ni kiwango kipya ambacho hujaza mashimo ya API asili ya Tarehe na pia kutatua baadhi ya vizuizi vinavyopatikana katika Moment na maktaba zingine. Muda ni Nini? Temporal ni API mpya ya wakati na tarehe inayoongezwa kwa kiwango cha ECMAScript, ambacho hufafanua JavaScript ya kisasa. Kuanzia Machi 20266, imefikia Hatua ya 4 ya mchakato wa TC39 (kamati inayosimamia mapendekezo na nyongeza kwa lugha ya JavaScript), na itajumuishwa katika toleo linalofuata la vipimo vya ECMAScript. Tayari imetekelezwa katika vivinjari kadhaa: Chrome 144+ na Firefox 139+, huku Safari ikitarajiwa kufuata hivi karibuni. Ujazo wa aina nyingi pia unapatikana kwa vivinjari visivyotumika na Node.js. API ya Muda huunda vitu ambavyo, kwa ujumla, vinawakilisha muda kwa wakati. Hizi zinaweza kuwa stempu za muda na tarehe katika saa za eneo fulani, au zinaweza kuwa mfano wa kawaida wa "saa ya ukutani" bila maelezo ya saa za eneo au tarehe. Baadhi ya sifa kuu za Muda ni pamoja na:
Nyakati zilizo na au zisizo na tarehe. Kitu cha Muda kinaweza kuwakilisha wakati mahususi katika tarehe mahususi, au wakati usio na taarifa yoyote ya tarehe. Tarehe maalum, bila wakati, inaweza pia kuwakilishwa. Usaidizi wa saa za eneo. Vipengee vya muda vinafahamu kikamilifu saa za eneo na vinaweza kubadilishwa katika maeneo tofauti ya saa. Moment inasaidia maeneo ya saa, pia, lakini inahitaji maktaba ya ziada ya saa za eneo. Kutobadilika.Kipengele cha Muda kinapoundwa, hakiwezi kubadilishwa. Ubadilishaji wa hesabu ya saa au eneo la saa haurekebishi kitu cha msingi. Badala yake, wao hutoa kitu kipya cha Muda. Uwekaji faharasa wa msingi 1. Chanzo cha kawaida cha hitilafu kwa API ya Tarehe (pamoja na Moment) ni kwamba miezi haijawekwa katika faharasa sifuri. Hii ina maana kwamba Januari ni mwezi 0, badala ya mwezi 1 kama sisi sote tunaelewa katika maisha halisi. Muda hurekebisha hili kwa kutumia faharasa yenye msingi 1 - Januari ni mwezi 1. Imeundwa ndani ya kivinjari. Kwa kuwa Muda ni API katika kivinjari chenyewe, haiongezi chochote kwenye saizi ya kifurushi cha programu yako.
Ni muhimu pia kutambua kuwa API ya Tarehe haiondoki. Ingawa Muda unachukua nafasi ya API hii, haiondolewi wala haitumiki. Programu nyingi zingevunjika ikiwa vivinjari viliondoa API ya Tarehe ghafla. Hata hivyo, pia kumbuka kuwa Moment sasa inachukuliwa kuwa mradi wa urithi katika hali ya matengenezo. Katika sehemu iliyosalia ya makala, tutaangalia baadhi ya "mapishi" ya kuhamisha msimbo unaotegemea Muda hadi API mpya ya Muda. Wacha tuanze kurekebisha! Kuunda Vitu vya Tarehe na Wakati Kabla ya kuendesha tarehe na nyakati, tunapaswa kuunda vitu vinavyowakilisha. Ili kuunda kitu cha Moment kinachowakilisha tarehe na wakati wa sasa, tumia kipengele cha kukokotoa cha muda. const now = moment(); console.log(sasa); // Moment<2026-02-18T21:26:29-05:00>
Kifaa hiki sasa kinaweza kuumbizwa au kubadilishwa inavyohitajika.
// Badilisha kwa UTC //onyo: Hii inabadilisha kitu cha Moment na kukiweka katika hali ya UTC! console.log(now.utc()); // Moment<2026-02-19T02:26:29Z>
// chapisha kamba iliyoumbizwa - kumbuka kuwa inatumia wakati wa UTC sasa console.log(now.format('MM/DD/YYYY hh:mm:ss a')); // 02/19/2026 02:27:07 am
Jambo kuu la kukumbuka kuhusu Muda ni kwamba kitu cha Muda hujumuisha taarifa kuhusu saa na tarehe. Iwapo unahitaji tu kufanya kazi na maelezo ya wakati, hii ni sawa, lakini inaweza kusababisha tabia isiyotarajiwa katika hali kama vile Muda wa Kuokoa Mchana au miaka mirefu, ambapo tarehe inaweza kuathiri hesabu za saa. Muda ni rahisi zaidi. Unaweza kuunda kitu kinachowakilisha tarehe na wakati wa sasa kwa kuunda kitu cha Muda. Papo hapo. Hii inawakilisha hatua kwa wakati iliyofafanuliwa na wakati tangu "enzi" (UTC ya usiku wa manane mnamo Januari 1, 1970). Muda unaweza kurejelea papo hapo kwa wakati kwa usahihi wa kiwango cha nanosecond. const sasa = Temporal.Now.instant();
// ona nanosekunde mbichi tangu enzi console.log(now.epochNanoseconds); // 1771466342612000000n
// umbizo la UTC console.log(now.toString()); // 2026-02-19T01:55:27.844Z
// umbizo la eneo fulani la saa console.log(now.toString({ timeZone: 'America/New_York' })); // 2026-02-18T20:56:57.905-05:00
Vitu vya Muda.Papo hapo vinaweza pia kuundwa kwa muda na tarehe mahususi kwa kutumia mbinu ya kutoka tuli.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Fomati papo hapo katika ukanda wa saa wa ndani. Kumbuka kuwa hii inadhibiti tu // umbizo - haibadilishi kitu kama moment.utc inavyofanya. console.log(myInstant.toString({ timeZone: 'America/New_York' })); // 2026-02-18T21:10:00-05:00
Unaweza pia kuunda aina zingine za vitu vya Muda, pamoja na:
Temporal.PlainDate: Tarehe isiyo na taarifa za saa. Muda.Wakati Wazi: Muda usio na taarifa za tarehe. Muda.Tarehe iliyopangwaMuda: Tarehe na saa katika eneo maalum la saa.
Kila moja ya hizi ina mbinu ya kutoka ambayo inaweza kuitwa na kitu kinachobainisha tarehe na/au saa, au mfuatano wa tarehe wa kuchanganua. // Tarehe tu const today = Temporal.PlainDate.from({ mwaka: 2026, mwezi: 2, // kumbuka tunatumia 2 kwa Februari siku: 18 }); console.log(leo.toString()); // 2026-02-18
// Muda tu const lunchTime = Temporal.PlainTime.from({ saa: 12 }); console.log(lunchTime.toString()); // 12:00:00
// Tarehe na saa katika ukanda wa saa wa Mashariki wa Marekani const dueAt = Temporal.ZonedDateTime.from({ Saa za eneo: 'Amerika/New_York', mwaka: 2026, mwezi: 3, siku: 1, saa: 12, dakika: 0, pili: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[Amerika/New_York]
Kuchanganua Tumeshughulikia uundaji wa programu wa maelezo ya tarehe na saa. Sasa hebu tuangalie uchanganuzi. Kuchanganua ni eneo moja ambapo Moment ni rahisi kunyumbulika kuliko API ya Muda iliyojengewa ndani. Unaweza kuchanganua mfuatano wa tarehe kwa kuipitisha kwa kipengele cha kukokotoa wakati. Kwa hoja moja, Moment inatarajia mfuatano wa tarehe wa ISO, lakini unaweza kutumia fomati mbadala ikiwa utatoa hoja ya pili inayobainisha umbizo la tarehe inayotumika.
const isoDate = moment('2026-02-21T09:00:00'); const formattedDate = moment('2/21/26 9:00:00', 'M/D/YY h:mm:ss');
console.log(isoDate); // Moment<2026-02-21T09:00:00-05:00>
console.log(formattedDate); // Moment<2026-02-21T09:00:00-05:00>
Katika matoleo ya zamani, Moment ingefanya ubashiri bora wa kuchanganua mfuatano wowote wa tarehe ulioumbizwa kiholela. Hii inaweza kusababisha matokeo yasiyotabirika. Kwa mfano, ni 02-03-2026 Februari 2 au Machi 3? Kwa sababu hii, matoleo mapya zaidi ya Moment yanaonyesha onyo maarufu la kuacha kutumika ikiwa litaitwa bila mfuatano wa tarehe ulioumbizwa wa ISO (isipokuwa hoja ya pili yenye umbizo unaotaka pia imetolewa). Temporal itachanganua tu mfuatano wa tarehe ulioumbizwa mahususi. Mfuatano huo lazima uambatane na umbizo la ISO 8601 au kiendelezi chake, RFC 9557. Mfuatano wa tarehe usiotii utapitishwa kwa njia ya kutoka, Temporal itatupa RangeError.
// Kwa kutumia mfuatano wa tarehe wa RFC 9557 const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[Amerika/New_York]'); console.log(myDate.toString({ timeZone: 'America/New_York' })); // 2026-02-21T09:00:00-05:00
// Kutumia mfuatano wa tarehe usiojulikana const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // Hitilafu ya Masafa: Hitilafu ya muda: Herufi batili wakati wa kuchanganua thamani ya mwaka.
Mahitaji kamili ya mfuatano wa tarehe hutegemea ni aina gani ya kitu cha Muda unachounda. Katika mfano ulio hapo juu, Temporal.Instant inahitaji ISO kamiliMfuatano wa tarehe wa 8601 au RFC 9557 unaobainisha tarehe na saa kwa kutumia saa za eneo, lakini unaweza pia kuunda vitu vya PlainDate au PlainTime kwa kutumia kikundi kidogo cha umbizo la tarehe. 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
Kumbuka kwamba mifuatano hii bado lazima ifuate umbizo linalotarajiwa, au hitilafu itatupwa.
// Kutumia mifuatano ya wakati isiyotii. Haya yote yatatupa RangeError. Muda.Wazi.Wazi.kutoka('9:00'); Muda.Wazi.Wazi.kutoka('9:00:00 AM');
Kidokezo cha kitaalamu: Kushughulikia mifuatano isiyo ya ISOKwa sababu Muda hutanguliza kutegemewa, haitajaribu kubahatisha umbizo la mfuatano kama 02-01-2026. Ikiwa chanzo chako cha data kinatumia mifuatano kama hii, utahitaji kufanya upotoshaji wa kamba ili kupanga upya thamani katika mfuatano wa ISO kama 2026-02-01 kabla ya kujaribu kuitumia na Muda.
Uumbizaji Mara tu ukiwa na kitu cha Muda au Muda, labda utataka kukibadilisha kuwa mfuatano ulioumbizwa wakati fulani. Huu ni mfano ambapo Moment ni mfupi zaidi. Unaita njia ya umbizo la kitu na mfuatano wa ishara zinazoelezea umbizo la tarehe unayotaka. const date = moment();
console.log(date.format('MM/DD/YYYY')); // 02/22/2026
console.log(date.format('MMMM Fanya YYYY, h:mm:ss a')); // Februari 22 2026, 8:18:30 pm
Kwa upande mwingine, Muda unakuhitaji uwe na kitenzi zaidi. Vipengee vya muda, kama vile Papo hapo, vina mbinu ya toLocaleString ambayo inakubali chaguo mbalimbali za umbizo zilizobainishwa kama sifa za kitu.
const date = Temporal.Now.instant();
// bila hoja, tutapata umbizo chaguo-msingi la lugha ya sasa console.log(date.toLocaleString()); // 2/22/2026, 8:23:36 PM (kwa kuchukulia eneo la en-US)
// kupitisha chaguzi za umbizo ili kutoa mfuatano maalum wa umbizo console.log(date.toLocaleString('en-US', { mwezi: 'muda mrefu', siku: 'nambari', mwaka: 'nambari', saa: 'tarakimu 2', dakika: 'tarakimu 2' })); // Februari 22, 2026 saa 8:23 PM
// pitisha tu sehemu unazotaka katika safu ya umbizo console.log(date.toLocaleString('en-US', { mwezi: 'fupi', siku: 'nambari' })); // Februari 22
Uumbizaji wa tarehe za muda hutumia API ya Intl.DateTimeFormat (ambayo tayari inapatikana kwa urahisi katika vivinjari vya kisasa) chini ya kifuniko. Hiyo inamaanisha kuwa unaweza kuunda kitu kinachoweza kutumika tena cha DateTimeFormat kwa chaguo zako maalum za umbizo, kisha kupitisha Vipengee vya Muda kwa mbinu yake ya umbizo. Kwa sababu hii, haitumii fomati maalum za tarehe kama Moment inavyofanya. Ikiwa unahitaji kitu kama 'Q1 2026' au uumbizaji mwingine maalum, unaweza kuhitaji msimbo maalum wa uumbizaji wa tarehe au ufikie maktaba ya watu wengine. const formatter = new Intl.DateTimeFormat('en-US', { mwezi: 'tarakimu 2', siku: 'tarakimu 2', mwaka: 'nambari' });
const date = Temporal.Now.instant(); console.log(formatter.format(tarehe)); // 02/22/2026
Tokeni za uumbizaji wa Moment ni rahisi kuandika, lakini hazifai kwa eneo. Mifuatano ya muundo wa "misimbo ngumu" vitu kama vile mpangilio wa mwezi/siku. Faida ya kutumia kitu cha usanidi, kama Temporal hufanya, ni kwamba kitabadilika kiotomatiki kwa eneo lolote na kutumia umbizo sahihi. const date = Temporal.Now.instant();
const formatOptions = { mwezi: 'nambari', siku: 'nambari', mwaka: 'nambari' };
console.log(date.toLocaleString('en-US', formatOptions)); // 2/22/2026
console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026
Mahesabu ya tarehe Katika programu nyingi, utahitaji kuishia kufanya mahesabu kadhaa kwa tarehe. Unaweza kutaka kuongeza au kupunguza vitengo vya muda (siku, saa, sekunde, n.k.). Kwa mfano, ikiwa una tarehe ya sasa, unaweza kutaka kumwonyesha mtumiaji tarehe wiki 1 kuanzia sasa. Vipengee vya muda vina mbinu kama vile kuongeza na kutoa vinavyotekeleza shughuli hizi. Vitendaji hivi huchukua thamani na kitengo, kwa mfano: add(7, 'siku'). Tofauti moja muhimu sana kati ya Muda na Muda, hata hivyo, ni kwamba wakati wa kufanya hesabu hizi za tarehe, kitu cha msingi kinarekebishwa na thamani yake ya asili inapotea. const now = moment();
console.log(sasa); // Moment<2026-02-24T20:08:36-05:00>
const nextWeek = now.add(7, 'siku'); console.log(Wiki ijayo); // Moment<2026-03-03T20:08:36-05:00>
// Gotcha - kitu cha asili kilibadilishwa console.log(sasa); // Moment<2026-03-03T20:08:36-05:00>
Ili kuepuka kupoteza tarehe asili, unaweza kumpigia simu Clone kwenye kitu cha Moment ili kuunda nakala. const sasa= wakati (); const nextWeek = now.clone().ongeza(7, 'siku');
console.log(sasa); // Moment<2026-02-24T20:12:55-05:00>
console.log(Wiki ijayo); // Moment<2026-03-03T20:12:55-05:00>
Kwa upande mwingine, vitu vya Muda havibadiliki. Mara tu unapounda kitu kama Papo hapo, Tarehe Sanifu, na kadhalika, thamani ya kitu hicho haitabadilika kamwe. Vitu vya muda pia vina njia za kuongeza na kutoa. Muda ni chaguo kidogo kuhusu vitengo vya saa ambavyo vinaweza kuongezwa kwa aina za vitu. Kwa mfano, huwezi kuongeza siku kwa Papo hapo:
const sasa = Temporal.Now.instant(); const nextWeek = now.add({siku: 7}); // RangeError: Hitilafu ya muda: Sehemu kubwa zaidi haiwezi kuwa kitengo cha tarehe
Hii ni kwa sababu vipengee vya Papo Hapo vinawakilisha sehemu maalum kwa wakati katika UTC na ni kalenda-agnostic. Kwa sababu urefu wa siku unaweza kubadilika kulingana na sheria za eneo la saa kama vile Saa ya Kuokoa Mchana, hesabu hii haipatikani kwa Papo hapo. Unaweza, hata hivyo, kufanya operesheni hii kwa aina zingine za vitu, kama vile PlainDateTime: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 2/24/2026, 8:23:59 PM
const nextWeek = now.add({siku: 7});
// Kumbuka kuwa PlainDateTime asilia bado haijabadilika console.log(now.toLocaleString()); // 2/24/2026, 8:23:59 PM
console.log(nextWeek.toLocaleString()); // 3/3/2026, 8:23:59 PM
Unaweza pia kuhesabu ni saa ngapi kati ya vitu viwili vya Muda au Muda. Kwa utendakazi tofauti wa Moment, unahitaji kutoa kitengo cha uzito, vinginevyo kitarudisha tofauti katika milisekunde. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');
console.log(tarehe2.diff(tarehe1)); // 91800000
console.log(tarehe2.diff(tarehe1, 'siku')); // 1
Ili kufanya hivyo na kitu cha Muda, unaweza kupitisha kitu kingine cha Muda kwa hadi au tangu mbinu. Hii hurejesha kipengee cha Muda.Muda kilicho na taarifa kuhusu tofauti ya saa. Kipengee cha Muda kina sifa kwa kila sehemu ya tofauti, na pia kinaweza kutoa mfuatano wa muda wa ISO 8601 unaowakilisha tofauti ya wakati.
const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');
// Kitengo kikubwa kinabainisha kitengo kikubwa zaidi cha wakati cha kuwakilisha // katika hesabu ya muda const diff = date2.since(tarehe1, { largestUnit: 'day' });
console.log(diff.days); // 1
console.log(diff.hours); // 1
console.log(diff.minutes); // 30
console.log(diff.toString()); // P1DT1H30M // (Mfuatano wa muda wa ISO 8601: siku 1, saa 1, dakika 30)
Kulinganisha Tarehe na Nyakati Muda na Muda zote hukuruhusu kulinganisha tarehe na nyakati ili kubaini ni ipi huja kabla ya nyingine, lakini chukua mbinu tofauti na API. Moment hutoa mbinu kama vile isBefore, isAfter, na isSame kulinganisha vitu viwili vya Muda. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');
console.log(tarehe1.isBefore(tarehe2)); // kweli
Muda hutumia mbinu ya kulinganisha tuli kufanya ulinganisho kati ya vitu viwili vya aina moja. Inarudi -1 ikiwa tarehe ya kwanza inakuja kabla ya ya pili, 0 ikiwa ni sawa, au 1 ikiwa tarehe ya kwanza inakuja baada ya pili. Mfano ufuatao unaonyesha jinsi ya kulinganisha vitu viwili vya PlainDate. Hoja zote mbili kwa Temporal.PlainDate.compare lazima ziwe vitu vya PlainDate.
const date1 = Temporal.PlainDate.from({ mwaka: 2026, mwezi: 2, siku: 24}); const date2 = Temporal.PlainDate.from({ mwaka: 2026, mwezi: 3, siku: 24});
// tarehe1 inakuja kabla ya tarehe2, kwa hivyo -1 console.log(Temporal.PlainDate.compare(tarehe1, tarehe2));
// Hitilafu ikiwa tunajaribu kulinganisha vitu viwili vya aina tofauti console.log(Temporal.PlainDate.compare(tarehe1, Temporal.Now.instant())); // TypeError: Hitilafu ya muda: Sehemu za PlainDate zisizo sahihi zimetolewa.
Hasa, hii hurahisisha kupanga safu ya vitu vya Muda kwa mpangilio. // Safu ya vitu vya Muda.Tarehe wazi const dates = [ ... ];
// tumia Temporal.PlainDate.compare kama kitendakazi cha kulinganisha dates.sort(Temporal.PlainDate.compare);
Mabadiliko ya Eneo la Saa Maktaba kuu ya Moment haitumii ubadilishaji wa saa za eneo. Ikiwa unahitaji utendakazi huu, unahitaji pia kusakinisha kifurushi cha saa za eneo. Kifurushi hiki hakiwezi kutikisika kwa mti, na kwa hivyo kinaweza kuongeza kwa kiasi kikubwa kwa saizi ya kifungu chako. Baada ya kusakinisha eneo-saa, unaweza kubadilisha vipengee vya Moment kuwa saa tofauti kwa kutumia mbinu ya tz. Kama ilivyo kwa shughuli zingine za Moment, hii inabadilisha msingikitu. // Kwa kuchukua wakati wa Mashariki wa Amerika const now = moment(); console.log(sasa); // Moment<2026-02-28T20:08:20-05:00>
// Badilisha hadi wakati wa Pasifiki. // Wakati wa awali wa Mashariki umepotea. sasa.tz('America/Los_Angeles'); console.log(sasa); // Moment<2026-02-28T17:08:20-08:00>
Utendaji wa eneo la saa umejengwa katika API ya Muda unapotumia kipengee cha Muda.ZonedDateTime. Vipengee hivi ni pamoja na mbinu ya withTimeZone ambayo hurejesha ZonedDateTime mpya inayowakilisha muda sawa na wakati, lakini katika saa za eneo maalum. // Tena, kwa kuchukua wakati wa Mashariki wa Amerika const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 2/28/2026, 8:12:02 PM EST
// Badilisha hadi wakati wa Pasifiki const nowPacific = now.withTimeZone('America/Los_Angeles'); console.log(nowPacific.toLocaleString()); // 2/28/2026, 5:12:02 PM PST
// Kitu asilia bado hakijabadilika console.log(now.toLocaleString()); // 2/28/2026, 8:12:02 PM EST
Kumbuka: Thamani zilizoumbizwa zilizorejeshwa na toLocaleString, kama jina linamaanisha, zinategemea eneo. Sampuli ya msimbo iliundwa katika lugha ya en-US, kwa hivyo umbizo ni kama hili: 2/28/2026, 5:12:02 PM PST. Katika eneo lingine, hii inaweza kuwa tofauti. Kwa mfano, katika eneo la en-GB, utapata kitu kama 28/2/2026, 17:12:02 GMT-8. Urekebishaji wa Ulimwengu Halisi Tuseme tunaunda programu kwa ajili ya kuratibu matukio katika maeneo ya saa. Sehemu ya programu hii ni chaguo la kukokotoa, getEventTimes, ambalo huchukua mfuatano wa ISO 8601 unaowakilisha saa na tarehe ya tukio, saa za eneo na saa za eneo lengwa. Chaguo za kukokotoa huunda mifuatano ya saa na tarehe iliyoumbizwa kwa ajili ya tukio katika saa za kanda zote mbili. Ikiwa chaguo za kukokotoa zitapewa mfuatano wa ingizo ambao si mfuatano halali wa saa/tarehe, itatupa hitilafu. Huu hapa ni utekelezaji asili, kwa kutumia Moment (pia inahitaji matumizi ya kifurushi cha saa za eneo).
kuagiza muda kutoka 'moment-timezone';
kazi getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h:mm:ss a z';
// 1. Unda wakati wa awali katika eneo la saa la mtumiaji const eventTime = moment.tz( inputString, moment.ISO_8601, // Tarajia mfuatano wa ISO 8601 kweli, // Uchanganuzi mkali userTimeZone );
// Tupa hitilafu ikiwa inputString haikuwakilisha tarehe halali ikiwa (!eventTime.isValid()) { tupa Hitilafu mpya('Ingizo la tarehe/saa si sahihi'); }
// 2. Kuhesabu muda unaolengwa // MUHIMU: Ni lazima tutengeneze, au 'tukioTime' libadilike milele! const targetTime = eventTime.clone().tz(targetTimeZone);
kurudi { local: eventTime.format(timeFormat), lengo: targetTime.format(timeFormat), }; }
const ratiba = getEventTimes( '2026-03-05T15:00-05:00', 'Amerika/New_York', 'Ulaya/London', );
console.log(schedule.local); // Machi 5, 2026, 3:00:00 pm EST
console.log(schedule.target); // Machi 5, 2026, 8:00:00 pm GMT
Katika mfano huu, tunatumia muundo wa tarehe unaotarajiwa wa ISO 8601, ambao umeundwa kwa manufaa ya Moment. Pia tunatumia uchanganuzi mkali, kumaanisha Moment haitajaribu kubahatisha kwa mfuatano wa tarehe ambao haulingani na umbizo. Ikiwa mfuatano wa tarehe usio wa ISO utapitishwa, itasababisha kipengee cha tarehe kisicho sahihi, na tunatupa hitilafu. Utekelezaji wa Muda unaonekana sawa, lakini una tofauti chache muhimu.
kazi getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. Changanua ingizo moja kwa moja kwenye Papo hapo, kisha uunde // ZonedDateTime katika eneo la mtumiaji. const papo hapo = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);
// 2. Badilisha hadi eneo la lengo // Hii inarudisha kiotomati kitu KIPYA; 'EventTime' ni salama. const targetTime = eventTime.withTimeZone(targetTimeZone);
// 3. Fomati kwa kutumia Intl (imejengwa ndani) chaguzi za const = { mwaka: 'nambari', mwezi: 'fupi', siku: 'nambari', saa: 'nambari', dakika: 'tarakimu 2', pili: 'tarakimu 2', TimeZoneName: 'fupi' };
kurudi { local: eventTime.toLocaleString(navigator.language, options), lengo: targetTime.toLocaleString(navigator.language, chaguzi) }; }
const ratiba = getEventTimes( '2026-03-05T15:00-05:00', 'Amerika/New_York', 'Ulaya/London', );
console.log(schedule.local); // Machi 5, 2026, 3:00:00 PM EST
console.log(schedule.target); // Machi 5, 2026, 8:00:00 PM GMT
Kwa Muda, tunapaswa kubainisha kwa uwazi mfuatano wa umbizo la mifuatano ya tarehe inayotokana. Bila kujali eneo au eneo la mtumiaji, nyakati za tukio zitapangwa kila wakati kama tarehe 5 Machi 2026, 3:00:00pm EST. Pia, sio lazima tuweke ubaguzi. Ikiwa mfuatano batili utapitishwa kwa Temporal.Instant.from, Temporal itatupa ubaguzi. Jambo moja la kuzingatia ni kwamba hata kwa uchanganuzi mkali, toleo la Moment bado ni laini zaidi. Muda huhitaji urekebishaji wa saa za eneo mwishoni mwa mfuatano. Unapaswa pia kutambua kwamba kwa kuwa tunatumia navigator.language, msimbo huu utaendeshwa tu katika mazingira ya kivinjari, kwani kiongoza kirambazaji hakifafanuliwa katika mazingira ya Node.js. Utekelezaji wa Muda hutumia lugha ya sasa ya kivinjari (navigator.language), kwa hivyo mtumiaji atapata kiotomatiki nyakati za tukio zikiwa zimeumbizwa katika umbizo la saa za eneo lake. Katika eneo la en-US, hii ni tarehe 5 Machi 2026, 3:00:00 pm EST. Hata hivyo, ikiwa mtumiaji yuko London, kwa mfano, saa za matukio zitaumbizwa kuwa 5 Machi 2026, 15:00:00 GMT-5. Muhtasari
Kitendo Moment.js Muda Wakati wa sasa moment() Muda.Now.zonedDateTimeISO() Inachanganua ISO wakati(str) Muda.Papo hapo.kutoka(str) Ongeza muda .ongeza (7, 'siku') (inabadilika) .ongeza({siku: 7}) (kitu kipya) Tofauti .diff(nyingine, 'saa') .tangu(nyingine).saa Saa za eneo .tz('Eneo/Jina') .withTimeZone('Zone/Jina')
Kwa mtazamo wa kwanza, tofauti inaweza kuwa tofauti kidogo (na katika hali ya Muda, wakati mwingine sintaksia ya kitenzi na kali zaidi), lakini kuna faida kadhaa muhimu za kutumia Muda juu ya Moment.js:
Kuwa wazi zaidi kunamaanisha maajabu machache na hitilafu zisizotarajiwa. Muda unaweza kuonekana kuwa mpole zaidi, lakini unahusisha "nadhani," ambayo wakati mwingine inaweza kusababisha tarehe zisizo sahihi. Ikiwa unatoa kitu cha Muda kisicho sahihi, husababisha makosa. Ikiwa nambari itatumika, unajua kuwa una tarehe sahihi. Muda unaweza kuongeza ukubwa muhimu kwenye kifurushi cha programu, hasa ikiwa unatumia kifurushi cha saa za eneo. Muda hauongezi chochote (mara tu inaposafirishwa katika vivinjari unavyolenga). Kutobadilika hukupa imani kwamba hutawahi kupoteza au kubatilisha data unapotekeleza mabadiliko na uendeshaji wa tarehe. Uwasilishaji tofauti wa wakati (Instant, PlainDateTime, ZonedDateTime) kulingana na mahitaji yako, ambapo Moment huwa kiambatanisho cha muhuri wa wakati wa UTC. Temporal hutumia API za Intl kwa uumbizaji wa tarehe, ambayo ina maana kwamba unaweza kuwa na umbizo la kufahamu lugha bila kuhitaji kubainisha tokeni kwa uwazi.
Vidokezo juu ya Polyfill Kama ilivyotajwa hapo awali, kuna Ujazo wa Muda unaopatikana, unaosambazwa kama kifurushi cha npm kinachoitwa @js-temporal/polyfill. Ikiwa ungependa kutumia Temporal leo, utahitaji kujaza nakala nyingi ili kuauni vivinjari kama Safari ambazo bado hazijasafirisha API. Habari mbaya na hii ni kwamba itaongeza kwa saizi yako ya kifungu. Habari njema ni kwamba bado inaongeza chini sana kuliko wakati au eneo la wakati. Hapa kuna ulinganisho wa saizi za vifurushi kama ilivyoripotiwa na Bundlephobia.com, wavuti inayowasilisha habari juu ya saizi za kifurushi cha npm (bofya kwenye kila jina la kifurushi ili kuona uchambuzi wa Bundlephobia):
Kifurushi Minified Minified & gzipped @js-temporal/polyfill 154.1 kB kB 44.1 dakika 294.4 kB 75.4 kB wakati wa eneo MB 1 114.2 kB
Ujazo wa aina nyingi pia kihistoria umekuwa na masuala ya utendaji kuhusu utumiaji wa kumbukumbu, na wakati wa kuandika, inachukuliwa kuwa katika hali ya alpha. Kwa sababu hii, huenda usitake kuitumia katika uzalishaji hadi ifikie hali ya kukomaa zaidi. Habari nyingine njema ni kwamba tunatumai kuwa kujaza kwa aina nyingi hakutahitajika tena (isipokuwa unahitaji kuunga mkono vivinjari vya zamani, kwa kweli). Wakati wa kuandika, Temporal imesafirishwa katika Chrome, Edge, na Firefox. Bado haiko tayari kabisa katika Safari, ingawa inaonekana inapatikana ikiwa na bendera ya wakati wa utekelezaji kwenye Onyesho la Kuchungulia la hivi punde zaidi la Teknolojia.