Hampir semua jenis aplikasi yang ditulis dalam JavaScript berfungsi dengan masa atau tarikh dalam beberapa kapasiti. Pada mulanya, ini terhad kepada API Tarikh terbina dalam. API ini termasuk fungsi asas, tetapi agak terhad dalam perkara yang boleh dilakukannya. Pustaka pihak ketiga seperti Moment.js, dan API terbina dalam kemudiannya seperti API Antarabangsa dan API Temporal baharu, menambahkan kefleksibelan yang lebih besar untuk bekerja dengan masa dan tarikh. Kebangkitan Dan Kejatuhan Detik.js Moment.js ialah perpustakaan JavaScript dengan utiliti berkuasa untuk bekerja dengan masa dan tarikh. Ia termasuk ciri yang tiada daripada API Tarikh asas, seperti manipulasi zon waktu dan menjadikan banyak operasi biasa lebih mudah. Momen juga termasuk fungsi untuk memformat tarikh dan masa. Ia menjadi perpustakaan yang digunakan secara meluas dalam banyak aplikasi yang berbeza. Walau bagaimanapun, Moment juga mempunyai bahagian dalam isunya. Ia adalah perpustakaan yang besar, dan boleh menambah dengan ketara pada saiz berkas aplikasi. Oleh kerana pustaka tidak menyokong gegaran pokok (ciri pengikat moden yang boleh mengalih keluar bahagian perpustakaan yang tidak digunakan), keseluruhan pustaka Moment disertakan walaupun anda hanya menggunakan satu atau dua fungsinya. Isu lain dengan Moment ialah hakikat bahawa objek yang diciptanya boleh berubah. Memanggil fungsi tertentu pada objek Moment mempunyai kesan sampingan dan mengubah nilai objek tersebut. Ini boleh membawa kepada tingkah laku atau pepijat yang tidak dijangka. Pada tahun 2020, penyelenggara Moment memutuskan untuk meletakkan perpustakaan dalam mod penyelenggaraan. Tiada pembangunan ciri baharu sedang dilakukan, dan penyelenggara mengesyorkan agar tidak menggunakannya untuk projek baharu. Terdapat perpustakaan tarikh JavaScript lain, seperti date-fns, tetapi terdapat pemain baharu di bandar, API yang dibina terus ke dalam JavaScript: Temporal. Ia merupakan standard baharu yang mengisi lubang API Tarikh asal serta menyelesaikan beberapa pengehadan yang terdapat dalam Moment dan perpustakaan lain. Apa Itu Temporal? Temporal ialah API masa dan tarikh baharu yang ditambahkan pada standard ECMAScript, yang mentakrifkan JavaScript moden. Mulai Mac 20266, ia telah mencapai Tahap 4 dalam proses TC39 (jawatankuasa yang menyelia cadangan dan penambahan kepada bahasa JavaScript) dan akan disertakan dalam versi spesifikasi ECMAScript yang seterusnya. Ia telah pun dilaksanakan dalam beberapa penyemak imbas: Chrome 144+ dan Firefox 139+, dengan Safari dijangka akan menyusul tidak lama lagi. Polifill juga tersedia untuk penyemak imbas dan Node.js yang tidak disokong. API Temporal mencipta objek yang, secara amnya, mewakili detik dalam masa. Ini boleh menjadi setem sepenuh masa dan tarikh dalam zon waktu tertentu, atau ia boleh menjadi contoh generik masa "jam dinding" tanpa sebarang zon masa atau maklumat tarikh. Beberapa ciri utama Temporal termasuk:

Masa dengan atau tanpa tarikh. Objek Temporal boleh mewakili masa tertentu pada tarikh tertentu, atau masa tanpa sebarang maklumat tarikh. Tarikh tertentu, tanpa masa, juga boleh diwakili. Sokongan zon waktu.Objek temporal menyedari zon masa sepenuhnya dan boleh ditukar merentas zon waktu yang berbeza. Moment menyokong zon waktu juga, tetapi ia memerlukan perpustakaan zon waktu momen tambahan. Ketidakbolehubah.Setelah objek Temporal dicipta, ia tidak boleh diubah. Penukaran aritmetik masa atau zon masa tidak mengubah suai objek asas. Sebaliknya, mereka menjana objek Temporal baharu. pengindeksan berasaskan 1. Sumber biasa pepijat dengan API Tarikh (serta dengan Momen) ialah bulan diindeks sifar. Ini bermakna bahawa Januari adalah bulan 0, bukannya bulan 1 seperti yang kita semua fahami dalam kehidupan sebenar. Perbaikan sementara ini dengan menggunakan pengindeksan berasaskan 1 — Januari ialah bulan 1. Ia terbina dalam penyemak imbas. Memandangkan Temporal ialah API dalam penyemak imbas itu sendiri, ia tidak menambah apa-apa pada saiz berkas aplikasi anda.

Ia juga penting untuk ambil perhatian bahawa API Tarikh tidak akan hilang. Walaupun Temporal menggantikan API ini, ia tidak dialih keluar atau ditamatkan. Banyak aplikasi akan rosak jika penyemak imbas tiba-tiba mengalih keluar API Tarikh. Walau bagaimanapun, juga perlu diingat bahawa Moment kini dianggap sebagai projek warisan dalam mod penyelenggaraan. Dalam artikel yang lain, kita akan melihat beberapa "resipi" untuk memindahkan kod berasaskan Moment ke API Temporal baharu. Mari mulakan pemfaktoran semula! Mencipta Objek Tarikh Dan Masa Sebelum kita boleh memanipulasi tarikh dan masa, kita perlu mencipta objek yang mewakilinya. Untuk mencipta objek Moment yang mewakili tarikh dan masa semasa, gunakan fungsi momen. const sekarang = moment(); console.log(sekarang); // Detik<2026-02-18T21:26:29-05:00>

Objek ini kini boleh diformat atau dimanipulasi mengikut keperluan.

// tukar kepada UTC //amaran: Ini mengubah objek Moment dan meletakkannya dalam mod UTC! console.log(now.utc()); // Detik<2026-02-19T02:26:29Z>

// cetak rentetan berformat - ambil perhatian bahawa ia menggunakan masa UTC sekarang console.log(now.format('MM/DD/YYYY hh:mm:ss a')); // 19/02/2026 02:27:07 pagi

Perkara utama yang perlu diingat tentang Moment ialah objek Moment sentiasa menyertakan maklumat tentang masa dan tarikh. Jika anda hanya perlu bekerja dengan maklumat masa, ini biasanya baik, tetapi ia boleh menyebabkan gelagat yang tidak dijangka dalam situasi seperti Waktu Penjimatan Siang atau tahun lompat, di mana tarikh boleh memberi kesan pada pengiraan masa. Temporal lebih fleksibel. Anda boleh mencipta objek yang mewakili tarikh dan masa semasa dengan mencipta objek Temporal.Instant. Ini mewakili titik dalam masa yang ditentukan oleh masa sejak "zaman" (UTC tengah malam pada 1 Januari 1970). Temporal boleh merujuk segera ini dalam masa dengan ketepatan tahap nanosaat. const now = Temporal.Now.instant();

// lihat nanosaat mentah sejak zaman itu console.log(now.epochNanoseconds); // 1771466342612000000n

// format untuk UTC console.log(now.toString()); // 2026-02-19T01:55:27.844Z

// format untuk zon waktu tertentu console.log(now.toString({ Zon masa: 'America/New_York' })); // 2026-02-18T20:56:57.905-05:00

Temporal.Objek segera juga boleh dibuat untuk masa dan tarikh tertentu dengan menggunakan kaedah statik daripada.

const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');

// Format segera dalam zon waktu tempatan. Ambil perhatian bahawa ini hanya mengawal // pemformatan - ia tidak mengubah objek seperti moment.utc. console.log(myInstant.toString({ Zon masa: 'America/New_York' })); // 2026-02-18T21:10:00-05:00

Anda juga boleh membuat jenis objek Temporal yang lain, termasuk:

Temporal.PlainDate: Tarikh tanpa maklumat masa. Temporal.PlainTime: Masa tanpa maklumat tarikh. Temporal.ZonedDateTime: Tarikh dan masa dalam zon waktu tertentu.

Setiap daripada ini mempunyai kaedah dari yang boleh dipanggil dengan objek yang menyatakan tarikh dan/atau masa, atau rentetan tarikh untuk dihuraikan. // Hanya temu janji const today = Temporal.PlainDate.from({ tahun: 2026, bulan: 2, // ambil perhatian bahawa kami menggunakan 2 untuk Februari hari: 18 }); console.log(today.toString()); // 2026-02-18

// Hanya seketika const lunchTime = Temporal.PlainTime.from({ jam: 12 }); console.log(lunchTime.toString()); // 12:00:00

// Tarikh dan masa dalam zon waktu Timur AS const dueAt = Temporal.ZonedDateTime.from({ Zon masa: 'Amerika/New_York', tahun: 2026, bulan: 3, hari: 1, jam: 12, minit: 0, kedua: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[America/New_York]

Menghuraikan Kami telah membincangkan penciptaan program maklumat tarikh dan masa. Sekarang mari kita lihat penghuraian. Penghuraian ialah satu kawasan yang Momen lebih fleksibel daripada API Temporal terbina dalam. Anda boleh menghuraikan rentetan tarikh dengan menghantarnya ke fungsi momen. Dengan satu hujah, Moment menjangkakan rentetan tarikh ISO, tetapi anda boleh menggunakan format alternatif jika anda memberikan hujah kedua yang menyatakan format tarikh yang digunakan.

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); // Detik<2026-02-21T09:00:00-05:00>

console.log(formattedDate); // Detik<2026-02-21T09:00:00-05:00>

Dalam versi yang lebih lama, Moment akan membuat tekaan terbaik untuk menghuraikan sebarang rentetan tarikh yang diformat secara sewenang-wenangnya. Ini boleh membawa kepada hasil yang tidak dapat diramalkan. Sebagai contoh, adakah 02-03-2026 2 Februari atau 3 Mac? Atas sebab ini, versi Moment yang lebih baharu memaparkan amaran penamatan yang ketara jika ia dipanggil tanpa rentetan tarikh berformat ISO (melainkan hujah kedua dengan format yang dikehendaki turut diberikan). Temporal hanya akan menghuraikan rentetan tarikh yang diformat khusus. Rentetan mesti mematuhi format ISO 8601 atau sambungannya, RFC 9557. Jika rentetan tarikh yang tidak patuh dihantar kepada kaedah dari, Temporal akan membuang RangeError.

// Menggunakan rentetan tarikh RFC 9557 const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[America/New_York]'); console.log(myDate.toString({ Zon masa: 'America/New_York' })); // 2026-02-21T09:00:00-05:00

// Menggunakan rentetan tarikh yang tidak diketahui const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // RangeError: Ralat sementara: Aksara tidak sah semasa menghuraikan nilai tahun.

Keperluan tepat rentetan tarikh bergantung pada jenis objek Temporal yang anda buat. Dalam contoh di atas, Temporal.Instant memerlukan ISO penuhRentetan tarikh 8601 atau RFC 9557 yang menyatakan tarikh dan masa dengan mengimbangi zon masa, tetapi anda juga boleh mencipta objek PlainDate atau PlainTime menggunakan hanya subset format tarikh. 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

Ambil perhatian bahawa rentetan ini masih mesti mematuhi format yang dijangkakan atau ralat akan dilemparkan.

// Menggunakan rentetan masa yang tidak patuh. Ini semua akan membuang RangeError. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');

Petua pro: Mengendalikan rentetan bukan ISOOleh kerana Temporal mengutamakan kebolehpercayaan, ia tidak akan cuba meneka format rentetan seperti 02-01-2026. Jika sumber data anda menggunakan rentetan sedemikian, anda perlu melakukan beberapa manipulasi rentetan untuk menyusun semula nilai ke dalam rentetan ISO seperti 2026-02-01 sebelum cuba menggunakannya dengan Temporal.

Memformat Sebaik sahaja anda mempunyai objek Moment atau Temporal, anda mungkin mahu menukarnya kepada rentetan terformat pada satu ketika. Ini adalah contoh di mana Moment agak ringkas. Anda memanggil kaedah format objek dengan rentetan token yang menerangkan format tarikh yang dikehendaki. tarikh const = moment();

console.log(date.format('MM/DD/YYYY')); // 22/02/2026

console.log(date.format('MMMM Lakukan YYYY, h:mm:ss a')); // 22 Februari 2026, 8:18:30 malam

Sebaliknya, Temporal memerlukan anda untuk menjadi lebih bertele-tele. Objek temporal, seperti Instant, mempunyai kaedah toLocaleString yang menerima pelbagai pilihan pemformatan yang ditentukan sebagai sifat objek.

tarikh const = Temporal.Now.instant();

// tanpa hujah, kami akan mendapat format lalai untuk tempat semasa console.log(date.toLocaleString()); // 22/2/2026, 8:23:36 PM (dengan andaian tempat en-AS)

// lulus pilihan pemformatan untuk menjana rentetan format tersuai console.log(date.toLocaleString('en-US', { bulan: 'panjang', hari: 'numerik', tahun: 'numerik', jam: '2 digit', minit: '2 digit' })); // 22 Februari 2026 jam 8:23 malam

// hanya lulus medan yang anda mahu dalam rentetan format console.log(date.toLocaleString('en-US', { bulan: 'pendek', hari: 'numerik' })); // 22 Feb

Pemformatan tarikh sementara sebenarnya menggunakan API Intl.DateTimeFormat (yang sudah tersedia dalam penyemak imbas moden) di bawah hud. Ini bermakna anda boleh mencipta objek DateTimeFormat yang boleh diguna semula dengan pilihan pemformatan tersuai anda, kemudian hantar objek Temporal kepada kaedah formatnya. Oleh sebab itu, ia tidak menyokong format tarikh tersuai seperti Moment. Jika anda memerlukan sesuatu seperti 'Q1 2026' atau pemformatan khusus lain, anda mungkin memerlukan beberapa kod pemformatan tarikh tersuai atau capaian untuk pustaka pihak ketiga. const formatter = new Intl.DateTimeFormat('en-US', { bulan: '2 digit', hari: '2 digit', tahun: 'numerik' });

tarikh const = Temporal.Now.instant(); console.log(formatter.format(tarikh)); // 22/02/2026

Token pemformatan momen adalah lebih mudah untuk ditulis, tetapi ia tidak mesra tempat. Format rentetan "kod keras" perkara seperti pesanan bulan/hari. Kelebihan menggunakan objek konfigurasi, seperti yang dilakukan oleh Temporal, ialah ia akan menyesuaikan secara automatik ke mana-mana tempat tertentu dan menggunakan format yang betul. tarikh const = Temporal.Now.instant();

const formatOptions = { bulan: 'numerik', hari: 'numerik', tahun: 'numerik' };

console.log(date.toLocaleString('en-US', formatOptions)); // 22/2/2026

console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026

Pengiraan tarikh Dalam banyak aplikasi, anda perlu melakukan beberapa pengiraan pada suatu tarikh. Anda mungkin mahu menambah atau menolak unit masa (hari, jam, saat, dsb.). Sebagai contoh, jika anda mempunyai tarikh semasa, anda mungkin mahu menunjukkan kepada pengguna tarikh 1 minggu dari sekarang. Objek momen mempunyai kaedah seperti tambah dan tolak yang melaksanakan operasi ini. Fungsi ini mengambil nilai dan unit, sebagai contoh: tambah(7, 'hari'). Walau bagaimanapun, satu perbezaan yang sangat penting antara Moment dan Temporal ialah apabila melakukan pengiraan tarikh ini, objek asas diubah suai dan nilai asalnya hilang. const sekarang = moment();

console.log(sekarang); // Detik<2026-02-24T20:08:36-05:00>

const nextWeek = now.add(7, 'hari'); console.log(nextWeek); // Detik<2026-03-03T20:08:36-05:00>

// Gotcha - objek asal telah bermutasi console.log(sekarang); // Detik<2026-03-03T20:08:36-05:00>

Untuk mengelakkan kehilangan tarikh asal, anda boleh memanggil klon pada objek Moment untuk membuat salinan. const sekarang= saat(); const nextWeek = now.clone().tambah(7, 'hari');

console.log(sekarang); // Detik<2026-02-24T20:12:55-05:00>

console.log(nextWeek); // Detik<2026-03-03T20:12:55-05:00>

Sebaliknya, objek Temporal tidak boleh diubah. Sebaik sahaja anda telah mencipta objek seperti Instant, PlainDate dan sebagainya, nilai objek itu tidak akan berubah. Objek temporal juga mempunyai kaedah tambah dan tolak. Temporal agak pemilih tentang unit masa yang boleh ditambah pada jenis objek. Sebagai contoh, anda tidak boleh menambah hari pada Semerta:

const now = Temporal.Now.instant(); const nextWeek = now.add({ hari: 7 }); // RangeError: Ralat sementara: Unit terbesar tidak boleh menjadi unit tarikh

Ini kerana objek segera mewakili titik masa tertentu dalam UTC dan agnostik kalendar. Disebabkan tempoh hari boleh berubah berdasarkan peraturan zon waktu seperti Waktu Penjimatan Siang, pengiraan ini tidak tersedia pada Semerta. Walau bagaimanapun, anda boleh melakukan operasi ini pada jenis objek lain, seperti PlainDateTime: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 24/2/2026, 8:23:59 PM

const nextWeek = now.add({ hari: 7 });

// Ambil perhatian bahawa PlainDateTime asal kekal tidak berubah console.log(now.toLocaleString()); // 24/2/2026, 8:23:59 PM

console.log(nextWeek.toLocaleString()); // 3/3/2026, 8:23:59 PM

Anda juga boleh mengira berapa banyak masa antara dua objek Momen atau Temporal. Dengan fungsi perbezaan Moment, anda perlu menyediakan unit untuk butiran, jika tidak, ia akan mengembalikan perbezaan dalam milisaat. 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, 'days')); // 1

Untuk melakukan ini dengan objek Temporal, anda boleh menghantar objek Temporal lain kepada kaedah sehingga atau sejaknya. Ini mengembalikan objek Temporal.Duration yang mengandungi maklumat tentang perbezaan masa. Objek Tempoh mempunyai sifat untuk setiap komponen perbezaan, dan juga boleh menjana rentetan tempoh ISO 8601 yang mewakili perbezaan masa.

const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');

// largestUnit menentukan unit masa terbesar untuk diwakili // dalam pengiraan tempoh const diff = tarikh2.sejak(tarikh1, {Unit terbesar: 'hari' });

console.log(diff.days); // 1

console.log(diff.hours); // 1

console.log(diff.minit); // 30

console.log(diff.toString()); // P1DT1H30M // (Rentetan tempoh ISO 8601: 1 hari, 1 jam, 30 minit)

Membandingkan Tarikh Dan Masa Moment dan Temporal kedua-duanya membolehkan anda membandingkan tarikh dan masa untuk menentukan yang mana datang sebelum yang lain, tetapi mengambil pendekatan yang berbeza dengan API. Moment menyediakan kaedah seperti isBefore, isAfter, dan isSame untuk membandingkan dua objek Moment. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');

console.log(date1.isBefore(date2)); // benar

Temporal menggunakan kaedah perbandingan statik untuk melakukan perbandingan antara dua objek daripada jenis yang sama. Ia mengembalikan -1 jika tarikh pertama datang sebelum yang kedua, 0 jika ia sama, atau 1 jika tarikh pertama datang selepas yang kedua. Contoh berikut menunjukkan cara membandingkan dua objek PlainDate. Kedua-dua hujah kepada Temporal.PlainDate.compare mestilah objek PlainDate.

const date1 = Temporal.PlainDate.from({ tahun: 2026, bulan: 2, hari: 24 }); const date2 = Temporal.PlainDate.from({ tahun: 2026, bulan: 3, hari: 24 });

// tarikh1 datang sebelum tarikh2, jadi -1 console.log(Temporal.PlainDate.compare(date1, date2));

// Ralat jika kita cuba membandingkan dua objek yang berlainan jenis console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: Ralat sementara: Medan PlainDate tidak sah disediakan.

Khususnya, ini memudahkan untuk mengisih tatasusunan objek Temporal secara kronologi. // Tatasusunan objek Temporal.PlainDate tarikh const = [ ... ];

// gunakan Temporal.PlainDate.compare sebagai fungsi pembanding tarikh.sort(Temporal.PlainDate.compare);

Penukaran Zon Masa Pustaka Moment teras tidak menyokong penukaran zon waktu. Jika anda memerlukan fungsi ini, anda juga perlu memasang pakej zon waktu momen. Pakej ini tidak boleh digoncang pokok, dan oleh itu boleh menambah dengan ketara saiz berkas anda. Setelah anda memasang zon waktu momen, anda boleh menukar objek Moment kepada zon waktu berbeza dengan kaedah tz. Seperti operasi Moment yang lain, ini mengubah asasnyaobjek. // Dengan mengandaikan masa Timur AS const sekarang = moment(); console.log(sekarang); // Detik<2026-02-28T20:08:20-05:00>

// Tukar kepada masa Pasifik. // Masa Timur asal telah hilang. now.tz('America/Los_Angeles'); console.log(sekarang); // Detik<2026-02-28T17:08:20-08:00>

Kefungsian zon waktu dibina ke dalam API Temporal apabila menggunakan objek Temporal.ZonedDateTime. Objek ini termasuk kaedah withTimeZone yang mengembalikan ZonedDateTime baharu yang mewakili detik masa yang sama, tetapi dalam zon waktu yang ditentukan. // Sekali lagi, dengan mengandaikan masa Timur AS const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 28/2/2026, 8:12:02 PTG EST

// Tukar kepada masa Pasifik const nowPacific = now.withTimeZone('America/Los_Angeles'); console.log(nowPacific.toLocaleString()); // 28/2/2026, 5:12:02 PTG PST

// Objek asal kekal tidak berubah console.log(now.toLocaleString()); // 28/2/2026, 8:12:02 PTG EST

Nota: Nilai diformat yang dikembalikan oleh toLocaleString adalah, seperti namanya, bergantung kepada setempat. Kod sampel telah dibangunkan dalam tempat en-US, jadi formatnya adalah seperti ini: 2/28/2026, 5:12:02 PM PST. Di tempat lain, ini mungkin berbeza. Sebagai contoh, dalam tempat en-GB, anda akan mendapat sesuatu seperti 28/2/2026, 17:12:02 GMT-8. Pemfaktoran Semula Dunia Nyata Katakan kita sedang membina apl untuk menjadualkan acara merentas zon waktu. Sebahagian daripada apl ini ialah fungsi, getEventTimes, yang mengambil rentetan ISO 8601 yang mewakili masa dan tarikh acara, zon waktu tempatan dan zon waktu sasaran. Fungsi ini mencipta rentetan masa dan tarikh yang diformatkan untuk acara dalam kedua-dua zon waktu. Jika fungsi diberikan rentetan input yang bukan rentetan masa/tarikh yang sah, ia akan menimbulkan ralat. Berikut ialah pelaksanaan asal, menggunakan Moment (juga memerlukan penggunaan pakej zon waktu momen).

import detik dari 'moment-time zone';

fungsi getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h:mm:ss a z';

// 1. Cipta detik awal dalam zon waktu pengguna const eventTime = moment.tz( inputString, moment.ISO_8601, // Jangkakan rentetan ISO 8601 benar, // Penghuraian yang ketat userTimeZone );

// Lemparkan ralat jika inputString tidak mewakili tarikh yang sah jika (!eventTime.isValid()) { buang Ralat baru('Input tarikh/masa tidak sah'); }

// 2. Kira masa sasaran // KRITIKAL: Kita mesti mengklon, atau 'eventTime' berubah selama-lamanya! const targetTime = eventTime.clone().tz(targetTimeZone);

kembali { setempat: eventTime.format(timeFormat), sasaran: targetTime.format(timeFormat), }; }

jadual const = getEventTimes( '2026-03-05T15:00-05:00', 'Amerika/New_York', 'Eropah/London', );

console.log(schedule.local); // 5 Mac 2026, 3:00:00 petang EST

console.log(schedule.target); // 5 Mac 2026, 8:00:00 malam GMT

Dalam contoh ini, kami menggunakan format tarikh jangkaan ISO 8601, yang dibina secara berguna dalam Momen. Kami juga menggunakan penghuraian yang ketat, yang bermaksud Moment tidak akan cuba meneka dengan rentetan tarikh yang tidak sepadan dengan format. Jika rentetan tarikh bukan ISO diluluskan, ia akan menyebabkan objek tarikh tidak sah dan kami membuang ralat. Pelaksanaan Temporal kelihatan serupa, tetapi mempunyai beberapa perbezaan utama.

fungsi getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. Parsing input terus ke dalam Instant, kemudian buat // ZonedDateTime dalam zon pengguna. const instant = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);

// 2. Tukar ke zon sasaran // Ini secara automatik mengembalikan objek BARU; 'eventTime' selamat. const targetTime = eventTime.withTimeZone(targetTimeZone);

// 3. Format menggunakan Intl (terbina dalam) pilihan const = { tahun: 'numerik', bulan: 'pendek', hari: 'numerik', jam: 'numerik', minit: '2 digit', kedua: '2 digit', timeZoneName: 'pendek' };

kembali { setempat: eventTime.toLocaleString(navigator.language, options), sasaran: targetTime.toLocaleString(navigator.language, options) }; }

jadual const = getEventTimes( '2026-03-05T15:00-05:00', 'Amerika/New_York', 'Eropah/London', );

console.log(schedule.local); // 5 Mac 2026, 3:00:00 PTG EST

console.log(schedule.target); // 5 Mac 2026, 8:00:00 malam GMT

Dengan Moment, kita perlu menyatakan secara eksplisit rentetan format untuk rentetan tarikh yang terhasil. Tidak kira lokasi atau tempat pengguna, masa acara akan sentiasa diformatkan sebagai 5 Mac 2026, 3:00:00petang EST. Selain itu, kita tidak perlu membuang pengecualian secara eksplisit. Jika rentetan yang tidak sah dihantar ke Temporal.Instant.from, Temporal akan membuang pengecualian untuk kami. Satu perkara yang perlu diambil perhatian ialah walaupun dengan penghuraian yang ketat, versi Moment masih lebih lembut. Temporal memerlukan zon waktu diimbangi pada penghujung rentetan. Anda juga harus ambil perhatian bahawa memandangkan kami menggunakan navigator.language, kod ini hanya akan dijalankan dalam persekitaran penyemak imbas, kerana navigator tidak ditakrifkan dalam persekitaran Node.js. Pelaksanaan Temporal menggunakan tempat semasa penyemak imbas (navigator.language), jadi pengguna akan secara automatik mendapatkan masa acara diformatkan dalam format waktu tempatan mereka. Di kawasan en-AS, ini ialah 5 Mac 2026, 3:00:00 ptg EST. Walau bagaimanapun, jika pengguna berada di London, sebagai contoh, masa acara akan diformatkan sebagai 5 Mac 2026, 15:00:00 GMT-5. Ringkasan

Tindakan Moment.js Temporal Masa semasa saat() Temporal.Now.zonedDateTimeISO() Menghuraikan ISO momen(str) Temporal.Instant.from(str) Tambah masa .tambah(7, 'hari') (mutasi) .add({ hari: 7 }) (objek baharu) Perbezaan .diff(lain, 'jam') .sejak(lain).jam Zon masa .tz('Zon/Nama') .withTimeZone('Zon/Nama')

Pada pandangan pertama, perbezaannya mungkin sedikit berbeza (dan dalam kes Temporal, kadangkala lebih verbose dan lebih ketat) sintaks, tetapi terdapat beberapa kelebihan utama untuk menggunakan Temporal berbanding Moment.js:

Menjadi lebih eksplisit bermakna lebih sedikit kejutan dan pepijat yang tidak diingini. Momen mungkin kelihatan lebih lembut, tetapi ia melibatkan "tekaan", yang kadangkala boleh mengakibatkan tarikh yang salah. Jika anda memberikan Temporal sesuatu yang tidak sah, ia menimbulkan ralat. Jika kod berjalan, anda tahu anda mempunyai tarikh yang sah. Momen boleh menambah saiz yang ketara pada himpunan aplikasi, terutamanya jika anda menggunakan pakej zon waktu momen. Temporal tidak menambah apa-apa (sebaik sahaja ia dihantar dalam penyemak imbas sasaran anda). Ketidakbolehubahan memberi anda keyakinan bahawa anda tidak akan kehilangan atau menulis ganti data apabila melakukan penukaran dan operasi tarikh. Perwakilan masa yang berbeza (Instant, PlainDateTime, ZonedDateTime) bergantung pada keperluan anda, dengan Moment sentiasa menjadi pembalut di sekitar cap waktu UTC. Temporal menggunakan API Antarabangsa untuk pemformatan tarikh, yang bermaksud anda boleh mempunyai pemformatan sedar setempat tanpa perlu menyatakan token secara eksplisit.

Nota Pada Polyfill Seperti yang dinyatakan sebelum ini, terdapat poliisi Temporal yang tersedia, diedarkan sebagai pakej npm bernama @js-temporal/polyfill. Jika anda ingin menggunakan Temporal hari ini, anda memerlukan polyfill ini untuk menyokong penyemak imbas seperti Safari yang belum menghantar API lagi. Berita buruk dengan ini ialah ia akan menambah saiz berkas anda. Berita baiknya ialah ia masih menambah dengan ketara kurang daripada saat atau zon waktu saat. Berikut ialah perbandingan saiz berkas seperti yang dilaporkan oleh Bundlephobia.com, tapak web yang membentangkan maklumat mengenai saiz pakej npm (klik pada setiap nama pakej untuk melihat analisis Bundlephobia):

Pakej Dikecilkan Dikecilkan & digzip @js-temporal/polyfill 154.1 kB 44.1 kB seketika 294.4 kB 75.4 kB zon masa detik 1 MB 114.2 kB

Polyfill juga secara sejarah mempunyai beberapa isu prestasi sekitar penggunaan memori, dan semasa penulisan, ia dianggap dalam keadaan alfa. Disebabkan ini, anda mungkin tidak mahu menggunakannya dalam pengeluaran sehingga ia mencapai keadaan yang lebih matang. Berita baik yang lain ialah semoga polyfill tidak diperlukan lebih lama lagi (melainkan anda perlu menyokong penyemak imbas yang lebih lama, sudah tentu). Pada masa penulisan, Temporal telah dihantar dalam Chrome, Edge dan Firefox. Ia masih belum bersedia dalam Safari, walaupun nampaknya tersedia dengan bendera masa jalan pada Pratonton Teknologi terkini.

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free