JavaScript で書かれたほぼすべての種類のアプリケーションは、何らかの形で時刻や日付を処理します。当初、これは組み込みの Date API に限定されていました。この API には基本的な機能が含まれていますが、できることはかなり制限されています。 Moment.js などのサードパーティ ライブラリ、および Intl API や新しい Temporal API などのその後の組み込み API により、時刻と日付の操作に大幅な柔軟性が追加されます。 Moment.js の盛衰 Moment.js は、時刻と日付を操作するための強力なユーティリティを備えた JavaScript ライブラリです。これには、タイムゾーン操作など、基本的な Date API に欠けている機能が含まれており、多くの一般的な操作が簡素化されます。 Moment には、日付と時刻をフォーマットする関数も含まれています。これは、さまざまなアプリケーションで広く使用されるライブラリになりました。 ただし、Moment にも問題がありました。これは大規模なライブラリであり、アプリケーションのバンドル サイズが大幅に増加する可能性があります。このライブラリはツリー シェーク (ライブラリの未使用部分を削除できる最新のバンドラーの機能) をサポートしていないため、関数を 1 つまたは 2 つしか使用しない場合でも、Moment ライブラリ全体が含まれています。 Moment のもう 1 つの問題は、作成されるオブジェクトが変更可能であるという事実です。 Moment オブジェクトで特定の関数を呼び出すと副作用があり、そのオブジェクトの値が変化します。これにより、予期しない動作やバグが発生する可能性があります。 2020 年に、Moment の管理者はライブラリをメンテナンス モードにすることを決定しました。新しい機能の開発は行われていないため、メンテナは新しいプロジェクトにこれを使用しないことを推奨しています。 date-fns などの JavaScript 日付ライブラリは他にもありますが、JavaScript に直接組み込まれた API、Temporal という新しいプレーヤーが登場しました。これは、元の Date API の穴を埋めるだけでなく、Moment やその他のライブラリに見られる制限の一部を解決する新しい標準です。 時間的とは何ですか? Temporal は、最新の JavaScript を定義する ECMAScript 標準に追加される新しい時刻と日付の API です。 20266 年 3 月の時点で、TC39 プロセス (JavaScript 言語への提案と追加を監督する委員会) のステージ 4 に到達しており、ECMAScript 仕様の次のバージョンに含まれる予定です。これはすでに Chrome 144 以降と Firefox 139 以降のいくつかのブラウザに実装されており、Safari も間もなくそれに続く予定です。ポリフィルは、サポートされていないブラウザや Node.js でも使用できます。 Temporal API は、通常、ある時点を表すオブジェクトを作成します。これらは、特定のタイム ゾーンのフルタイムおよび日付スタンプにすることも、タイム ゾーンや日付情報を持たない「壁時計」時間の一般的なインスタンスにすることもできます。 Temporal の主な機能には次のようなものがあります。

日付付きまたは日付なしの時間。Temporal オブジェクトは、特定の日付の特定の時刻、または日付情報のない時刻を表すことができます。時刻を含まない特定の日付を表すこともできます。 タイム ゾーンのサポート。Temporal オブジェクトはタイム ゾーンを完全に認識し、異なるタイム ゾーン間で変換できます。 Moment はタイムゾーンもサポートしていますが、追加の moment-timezone ライブラリが必要です。 不変性。Temporal オブジェクトが作成されると、変更することはできません。時間算術変換またはタイムゾーン変換では、基礎となるオブジェクトは変更されません。代わりに、新しい Temporal オブジェクトを生成します。 1 から始まるインデックス。Date API (および Moment) の一般的なバグの原因は、月のインデックスが 0 であることです。これは、私たちが実際に理解しているように、1 月は月 1 ではなく、月 0 であることを意味します。 Temporal は、1 ベースのインデックスを使用してこの問題を修正します (1 月は月 1 です)。 これはブラウザに組み込まれています。Temporal はブラウザ自体の API であるため、アプリケーションのバンドル サイズには何も追加されません。

Date API は廃止されないことに注意することも重要です。 Temporal はこの API に取って代わりますが、削除または非推奨になることはありません。ブラウザーが突然 Date API を削除すると、多くのアプリケーションが壊れてしまいます。ただし、Moment は現在メンテナンス モードのレガシー プロジェクトとみなされていることにも留意してください。 この記事の残りの部分では、Moment ベースのコードを新しい Temporal API に移行するためのいくつかの「レシピ」を見ていきます。リファクタリングを始めましょう! 日付と時刻オブジェクトの作成 日付と時刻を操作する前に、それらを表すオブジェクトを作成する必要があります。現在の日付と時刻を表す Moment オブジェクトを作成するには、関数 moment を使用します。 const now = moment(); コンソール.ログ(現在); // モーメント<2026-02-18T21:26:29-05:00>

このオブジェクトは、必要に応じてフォーマットまたは操作できるようになります。

// UTCに変換 //警告: これにより、Moment オブジェクトが変更され、UTC モードになります。 console.log(now.utc()); // モーメント<2026-02-19T02:26:29Z>

// フォーマットされた文字列を出力します - 現在 UTC 時間が使用されていることに注意してください console.log(now.format('MM/DD/YYYY hh:mm:ss a')); // 2026 年 2 月 19 日 02:27:07 午前

Moment について覚えておくべき重要な点は、Moment オブジェクトには常に時刻と日付に関する情報が含まれていることです。時刻情報のみを操作する必要がある場合は、これで通常は問題ありませんが、夏時間やうるう年のような日付が時間計算に影響を与える可能性がある状況では、予期しない動作が発生する可能性があります。 時間的はより柔軟です。 Temporal.Instant オブジェクトを作成することで、現在の日付と時刻を表すオブジェクトを作成できます。これは、「エポック」 (1970 年 1 月 1 日の深夜 UTC) からの時間によって定義される時点を表します。 Temporal は、ナノ秒レベルの精度でこの瞬間を参照できます。 const now = Temporal.Now.instant();

// エポックからの生のナノ秒を表示します console.log(now.epochNano秒); // 1771466342612000000n

// UTC の形式 console.log(now.toString()); // 2026-02-19T01:55:27.844Z

// 特定のタイムゾーンの形式 console.log(now.toString({ timeZone: 'アメリカ/ニューヨーク' })); // 2026-02-18T20:56:57.905-05:00

Temporal.Instant オブジェクトは、from 静的メソッドを使用して、特定の日時に対して作成することもできます。

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

// インスタントをローカル タイム ゾーンでフォーマットします。これは制御のみであることに注意してください // 書式設定 - moment.utc のようにオブジェクトを変更しません。 console.log(myInstant.toString({ timeZone: 'アメリカ/ニューヨーク' })); // 2026-02-18T21:10:00-05:00

次のような他のタイプの時間オブジェクトを作成することもできます。

Temporal.PlainDate: 時間情報を持たない日付。 Temporal.PlainTime: 日付情報のない時刻。 Temporal.ZonedDateTime: 特定のタイムゾーンの日付と時刻。

これらにはそれぞれ、日付や時刻、または解析する日付文字列を指定するオブジェクトを使用して呼び出すことができる from メソッドがあります。 // ただのデート const today = Temporal.PlainDate.from({ 年: 2026、 month: 2, // 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、 2番目: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[アメリカ/ニューヨーク]

解析中 日付と時刻の情報をプログラムで作成する方法について説明しました。次に、解析を見てみましょう。解析は、Moment が組み込みの Temporal API よりも柔軟な領域の 1 つです。 日付文字列を moment 関数に渡すことで解析できます。引数が 1 つである場合、Moment は ISO 日付文字列を想定しますが、使用する日付形式を指定する 2 番目の引数を指定すると、代替形式を使用できます。

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); // モーメント<2026-02-21T09:00:00-05:00>

console.log(formattedDate); // モーメント<2026-02-21T09:00:00-05:00>

古いバージョンでは、Moment は任意にフォーマットされた日付文字列を解析するために最善の推測を行っていました。これにより、予期しない結果が生じる可能性があります。たとえば、02-03-2026 は 2 月 2 日ですか、それとも 3 月 3 日ですか?このため、Moment の新しいバージョンでは、ISO 形式の日付文字列を使用せずに呼び出された場合、(目的の形式の 2 番目の引数も指定されていない限り) 非推奨の警告が顕著に表示されます。 Temporal は、特別にフォーマットされた日付文字列のみを解析します。文字列は ISO 8601 形式またはその拡張子である RFC 9557 に準拠している必要があります。準拠していない日付文字列が from メソッドに渡された場合、Temporal は RangeError をスローします。

// RFC 9557 日付文字列を使用する const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[アメリカ/ニューヨーク]'); console.log(myDate.toString({ timeZone: 'アメリカ/ニューヨーク' })); // 2026-02-21T09:00:00-05:00

// 不明な日付文字列を使用する const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // RangeError: 一時的エラー: 年の値の解析中に無効な文字です。

日付文字列の正確な要件は、作成する時間オブジェクトの種類によって異なります。上の例では、Temporal.Instant には完全な ISO が必要です8601 または RFC 9557 の日付文字列は、タイム ゾーン オフセットを使用して日付と時刻を指定しますが、日付形式のサブセットのみを使用して PlainDate オブジェクトまたは PlainTime オブジェクトを作成することもできます。 const myDate = Temporal.PlainDate.from('2026-02-21'); console.log(myDate.toString()); // 2026-02-21

const myTime = Temporal.PlainTime.from('09:00:00'); console.log(myTime.toString()); // 09:00:00

これらの文字列は予期された形式に準拠している必要があり、準拠していない場合はエラーがスローされることに注意してください。

// 準拠していない時刻文字列を使用しています。これらはすべて RangeError をスローします。 Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');

プロのヒント: 非 ISO 文字列の処理 Temporal は信頼性を優先するため、02-01-2026 のような文字列の形式を推測しようとしません。データ ソースでこのような文字列が使用されている場合は、Temporal で使用する前に、文字列操作を行って値を 2026-02-01 のような ISO 文字列に再配置する必要があります。

書式設定 Moment または Temporal オブジェクトを取得したら、おそらく、ある時点でそれを書式設定された文字列に変換したくなるでしょう。 これは、Moment がもう少し簡潔になっている例です。目的の日付形式を記述するトークンの文字列を使用して、オブジェクトの format メソッドを呼び出します。 const date = moment();

console.log(date.format('MM/DD/YYYY')); // 2026 年 2 月 22 日

console.log(date.format('MMMM Do YYYY, h:mm:ss a')); // 2026 年 2 月 22 日、午後 8 時 18 分 30 秒

一方、Temporal では、もう少し冗長にする必要があります。 Instant などの時間オブジェクトには、オブジェクトのプロパティとして指定されたさまざまな書式設定オプションを受け入れる toLocaleString メソッドがあります。

const date = Temporal.Now.instant();

// 引数を指定しないと、現在のロケールのデフォルト形式が取得されます。 console.log(date.toLocaleString()); // 2/22/2026、8:23:36 PM (en-US ロケールを想定)

// 書式設定オプションを渡してカスタム書式文字列を生成します console.log(date.toLocaleString('en-US', { 月: '長い'、 日: '数値', 年: '数値', 時: '2桁'、 分:「2桁」 })); // 2026 年 2 月 22 日午後 8 時 23 分

// フォーマット文字列に必要なフィールドのみを渡します console.log(date.toLocaleString('en-US', { 月: '短い'、 日: '数値' })); // 2月22日

時間的な日付の書式設定は、実際には内部で Intl.DateTimeFormat API (最新のブラウザーではすでに簡単に利用可能です) を使用します。つまり、カスタム書式設定オプションを使用して再利用可能な DateTimeFormat オブジェクトを作成し、Temporal オブジェクトをその format メソッドに渡すことができます。このため、Moment のようなカスタム日付形式はサポートされていません。 「2026 年第 1 四半期」などの特殊な書式設定が必要な場合は、カスタムの日付書式設定コードを使用するか、サードパーティのライブラリを利用する必要がある場合があります。 const formatter = new Intl.DateTimeFormat('en-US', { 月: '2桁'、 日: '2桁'、 年: '数値' });

const date = Temporal.Now.instant(); console.log(formatter.format(日付)); // 2026 年 2 月 22 日

Moment の書式設定トークンは記述が簡単ですが、ロケールには対応していません。フォーマット文字列は、月/日の順序などを「ハードコード」します。 Temporal と同様に、構成オブジェクトを使用する利点は、指定されたロケールに自動的に適応し、正しい形式が使用されることです。 const date = Temporal.Now.instant();

const formatOptions = { 月: '数値', 日: '数値', 年: '数値' };

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

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

日付の計算 多くのアプリケーションでは、最終的に日付に対していくつかの計算を実行する必要があります。時間の単位 (日、時間、秒など) を加算または減算することができます。たとえば、現在の日付がある場合、ユーザーに 1 週​​間後の日付を表示したい場合があります。 Moment オブジェクトには、これらの操作を実行する加算や減算などのメソッドがあります。これらの関数は値と単位を受け取ります (例: add(7, 'days'))。ただし、Moment と Temporal の非常に重要な違いの 1 つは、これらの日付計算を実行すると、基礎となるオブジェクトが変更され、元の値が失われることです。 const now = moment();

コンソール.ログ(現在); // モーメント<2026-02-24T20:08:36-05:00>

const nextWeek = now.add(7, '日'); コンソール.ログ(来週); // モーメント<2026-03-03T20:08:36-05:00>

// 問題 - 元のオブジェクトが変更されました コンソール.ログ(現在); // モーメント<2026-03-03T20:08:36-05:00>

元の日付が失われないようにするには、Moment オブジェクトで clone を呼び出してコピーを作成します。 今すぐ定数にする= 瞬間(); const nextWeek = now.clone().add(7, '日');

コンソール.ログ(現在); // モーメント<2026-02-24T20:12:55-05:00>

コンソール.ログ(来週); // モーメント<2026-03-03T20:12:55-05:00>

一方、Temporal オブジェクトは不変です。 Instant や PlainDate などのオブジェクトを作成すると、そのオブジェクトの値は決して変更されません。時間オブジェクトには、加算メソッドと減算メソッドもあります。 Temporal は、どの時間単位をどのオブジェクト タイプに追加できるかについて少しうるさいです。たとえば、インスタントに日数を追加することはできません。

const now = Temporal.Now.instant(); const nextWeek = now.add({ days: 7 }); // RangeError: 時間的エラー: 最大単位を日付単位にすることはできません

これは、インスタント オブジェクトが UTC の特定の時点を表し、カレンダーに依存しないためです。 1 日の長さは夏時間などのタイム ゾーン ルールに基づいて変化する可能性があるため、この計算はインスタントでは使用できません。ただし、PlainDateTime などの他のタイプのオブジェクトに対してこの操作を実行することもできます。 const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 2026 年 2 月 24 日、午後 8 時 23 分 59 秒

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

// 元の PlainDateTime は変更されないことに注意してください console.log(now.toLocaleString()); // 2026 年 2 月 24 日、午後 8 時 23 分 59 秒

console.log(nextWeek.toLocaleString()); // 2026 年 3 月 3 日、午後 8 時 23 分 59 秒

2 つの Moment または Temporal オブジェクト間の時間を計算することもできます。 Moment の diff 関数では、粒度の単位を指定する必要があります。指定しないと、差分がミリ秒単位で返されます。 const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');

console.log(date2.diff(date1)); // 91800000

console.log(date2.diff(date1, 'days')); // 1

Temporal オブジェクトでこれを行うには、別の Temporal オブジェクトをその until メソッドまたは Because メソッドに渡すことができます。これにより、時差に関する情報を含む Temporal.Duration オブジェクトが返されます。期間オブジェクトには、差の各要素のプロパティがあり、時差を表す ISO 8601 期間文字列を生成することもできます。

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

// biggestUnit は表現する最大の時間単位を指定します // 継続時間の計算時 const diff = date2.since(date1, {最大単位: '日' });

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

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

console.log(差分.分); // 30

console.log(diff.toString()); // P1DT1H30M // (ISO 8601 期間文字列: 1 日、1 時間、30 分)

日付と時刻の比較 Moment と Temporal ではどちらも日付と時刻を比較してどちらが先かを判断できますが、API では異なるアプローチを採用します。 Moment には、2 つの 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)); //本当

Temporal は静的比較メソッドを使用して、同じタイプの 2 つのオブジェクト間の比較を実行します。最初の日付が 2 番目の日付より前にある場合は -1、等しい場合は 0、最初の日付が 2 番目の日付より後である場合は 1 を返します。次の例は、2 つの 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(date1, date2));

// タイプの異なる 2 つのオブジェクトを比較しようとするとエラーが発生します console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: 一時的エラー: 無効な PlainDate フィールドが指定されました。

特に、これにより、Temporal オブジェクトの配列を時系列に並べ替えるのが簡単になります。 // Temporal.PlainDate オブジェクトの配列 const 日付 = [ ... ];

// Temporal.PlainDate.compare をコンパレータ関数として使用します date.sort(Temporal.PlainDate.compare);

タイムゾーンの変換 コア Moment ライブラリはタイムゾーン変換をサポートしていません。この機能が必要な場合は、moment-timezone パッケージもインストールする必要があります。このパッケージはツリーシェーク可能ではないため、バンドルのサイズが大幅に増加する可能性があります。 moment-timezone をインストールしたら、tz メソッドを使用して Moment オブジェクトを別のタイムゾーンに変換できます。他のモーメント操作と同様に、これにより基礎となるオブジェクトが変更されます。物体。 // 米国東部時間を想定 const now = moment(); コンソール.ログ(現在); // モーメント<2026-02-28T20:08:20-05:00>

// 太平洋時間に変換します。 // 元の東部時間は失われます。 now.tz('アメリカ/ロサンゼルス'); コンソール.ログ(現在); // モーメント<2026-02-28T17:08:20-08:00>

Temporal.ZonedDateTime オブジェクトを使用する場合、タイム ゾーン機能が Temporal API に組み込まれます。これらのオブジェクトには、指定されたタイム ゾーン内の同じ瞬間を表す新しい ZonedDateTime を返す withTimeZone メソッドが含まれています。 // ここでも、米国東部時間と仮定します const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 2026 年 2 月 28 日、午後 8 時 12 分 02 秒(東部標準時)

// 太平洋時間に変換します const nowPacific = now.withTimeZone('アメリカ/ロサンゼルス'); console.log(nowPacific.toLocaleString()); // 2026 年 2 月 28 日、午後 5 時 12 分 02 秒(太平洋標準時)

// 元のオブジェクトは変更されません console.log(now.toLocaleString()); // 2026 年 2 月 28 日、午後 8 時 12 分 02 秒(東部標準時)

注: toLocaleString によって返される書式設定された値は、名前が示すように、ロケールに依存します。サンプル コードは en-US ロケールで開発されたため、形式は次のようになります: 2/28/2026, 5:12:02 PM PST。別のロケールでは、これは異なる場合があります。たとえば、en-GB ロケールでは、28/2/2026、17:12:02 GMT-8 のようになります。 現実世界のリファクタリング タイムゾーンをまたいでイベントをスケジュールするためのアプリを構築しているとします。このアプリの一部は関数 getEventTimes で、イベントの日時、ローカル タイム ゾーン、およびターゲット タイム ゾーンを表す ISO 8601 文字列を受け取ります。この関数は、両方のタイム ゾーンでイベントの書式設定された時刻と日付の文字列を作成します。 関数に有効な時刻/日付文字列ではない入力文字列が指定された場合、エラーがスローされます。 これは、Moment を使用した元の実装です (moment-timezone パッケージの使用も必要です)。

'moment-timezone' から瞬間をインポートします。

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

// 1. ユーザーのタイムゾーンで最初の瞬間を作成します consteventTime = moment.tz( 入力文字列、 moment.ISO_8601, // ISO 8601 文字列が必要です true, // 厳密な解析 ユーザータイムゾーン );

// inputString が有効な日付を表していない場合はエラーをスローします if (!eventTime.isValid()) { throw new Error('無効な日付/時刻入力'); }

// 2. 目標時間を計算する // 重要: クローンを作成する必要があります。そうしないと、「eventTime」が永久に変更されてしまいます。 const targetTime =eventTime.clone().tz(targetTimeZone);

戻り値 { ローカル:eventTime.format(timeFormat)、 ターゲット: targetTime.format(timeFormat)、 }; }

const スケジュール = getEventTimes( '2026-03-05T15:00-05:00', 'アメリカ/ニューヨーク', 「ヨーロッパ/ロンドン」、 );

console.log(スケジュール.ローカル); // 2026 年 3 月 5 日、午後 3:00:00 EST

コンソール.ログ(スケジュール.ターゲット); // 2026 年 3 月 5 日、午後 8:00:00 GMT

この例では、Moment に組み込まれている ISO 8601 の予想される日付形式を使用しています。また、厳密な解析も使用しています。つまり、Moment は形式に一致しない日付文字列を推測しようとしません。 ISO 以外の日付文字列が渡されると、無効な日付オブジェクトとなり、エラーがスローされます。 Temporal の実装は似ていますが、いくつかの重要な違いがあります。

function getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. 入力を直接インスタントに解析し、作成します // ユーザーのゾーンの ZonedDateTime。 const instant = Temporal.Instant.from(inputString); consteventTime = instant.toZonedDateTimeISO(userTimeZone);

// 2. ターゲットゾーンに変換します // これにより、自動的に NEW オブジェクトが返されます。 「eventTime」は安全です。 const targetTime =eventTime.withTimeZone(targetTimeZone);

// 3. Intl を使用したフォーマット (組み込み) const オプション = { 年: '数値', 月: '短い'、 日: '数値', 時: '数値', 分: '2桁'、 2 番目: '2 桁'、 タイムゾーン名: '短い' };

戻り値 { ローカル:eventTime.toLocaleString(navigator. language, options), ターゲット: targetTime.toLocaleString(navigator. language, options) }; }

const スケジュール = getEventTimes( '2026-03-05T15:00-05:00', 'アメリカ/ニューヨーク', 「ヨーロッパ/ロンドン」、 );

console.log(スケジュール.ローカル); // 2026 年 3 月 5 日、午後 3:00:00 EST

コンソール.ログ(スケジュール.ターゲット); // 2026 年 3 月 5 日、午後 8:00:00 GMT

Moment では、結果の日付文字列の形式文字列を明示的に指定する必要があります。ユーザーの場所やロケールに関係なく、イベント時間は常に 2026 年 3 月 5 日 3:00:00 の形式で表示されます。午後東部標準時。 また、明示的に例外をスローする必要もありません。無効な文字列が Temporal.Instant.from に渡されると、Temporal は例外をスローします。注意すべき点の 1 つは、厳密な解析を行ったとしても、Moment バージョンは依然としてより緩やかであるということです。 Temporal では、文字列の末尾にタイムゾーン オフセットが必要です。 また、navigator. language を使用しているため、navigator は Node.js 環境で定義されていないため、このコードはブラウザ環境でのみ実行されることにも注意してください。 Temporal 実装ではブラウザの現在のロケール (navigator. language) が使用されるため、ユーザーはローカル時間形式でフォーマットされたイベント時刻を自動的に取得します。 en-US ロケールでは、これは 2026 年 3 月 5 日午後 3:00:00 EST です。ただし、たとえばユーザーがロンドンにいる場合、イベント時刻は 2026 年 3 月 5 日、15:00:00 GMT-5 の形式で表示されます。 概要

アクション モーメント.js 時間的 現在時刻 瞬間() Temporal.Now.zonedDateTimeISO() ISO を解析しています 瞬間(str) Temporal.Instant.from(str) 時間を追加する .add(7, 'days') (変更) .add({ days: 7 }) (新しいオブジェクト) 違い .diff(その他, '時間') .since(その他).時間 タイムゾーン .tz('ゾーン/名前') .withTimeZone('ゾーン/名前')

一見すると、その違いはわずかに異なる (Temporal の場合は、より冗長で厳密な) 構文であるように見えますが、Moment.js よりも Temporal を使用することには、いくつかの重要な利点があります。

より明示的であるということは、予期せぬバグや予期せぬバグが少なくなるということを意味します。モーメントはより寛大であるように見えるかもしれませんが、「推測」が含まれるため、場合によっては不正確な日付が発生する可能性があります。 Temporal に無効なものを指定すると、エラーがスローされます。コードが実行されれば、有効な日付を取得したことがわかります。 特に moment-timezone パッケージを使用している場合、Moment によりアプリケーションのバンドルのサイズが大幅に増加する可能性があります。 Temporal は何も追加しません (ターゲット ブラウザーに配信されたら)。 不変性により、日付の変換や操作を実行するときにデータが失われたり上書きされたりすることがないという確信が得られます。 要件に応じて時間のさまざまな表現 (Instant、PlainDateTime、ZonedDateTime) が行われます。ここで、Moment は常に UTC タイムスタンプのラッパーです。 Temporal は日付の書式設定に Intl API を使用します。つまり、トークンを明示的に指定しなくても、ロケールを認識した書式設定を行うことができます。

ポリフィルに関する注意事項 前述したように、Temporal ポリフィルが利用可能であり、@js-temporal/polyfill という名前の npm パッケージとして配布されます。今すぐ Temporal を使用したい場合は、API がまだ提供されていない Safari などのブラウザをサポートするためにこのポリフィルが必要です。これの悪いニュースは、バンドルのサイズが増加することです。良いニュースは、追加される値が瞬間または瞬間タイムゾーンよりも大幅に少ないことです。以下は、npm パッケージ サイズに関する情報を提供する Web サイト Bundlephobia.com によって報告されたバンドル サイズの比較です (Bundlephobia 分析を表示するには、各パッケージ名をクリックします)。

パッケージ 縮小された 縮小&gzip圧縮 @js-temporal/polyfill 154.1KB 44.1KB 瞬間 294.4KB 75.4KB 瞬間のタイムゾーン 1MB 114.2KB

また、ポリフィルには歴史的にメモリ使用量に関するパフォーマンスの問題がいくつかあり、この記事の執筆時点ではアルファ状態であると考えられています。このため、より成熟した状態に達するまでは実稼働環境で使用しない方がよいでしょう。 もう 1 つの良いニュースは、ポリフィルが今後それほど必要とされなくなることを願うということです (もちろん、古いブラウザをサポートする必要がない限り)。この記事の執筆時点では、Temporal は Chrome、Edge、Firefox に搭載されています。 Safari ではまだ完全に準備ができていませんが、最新のテクノロジー プレビューでランタイム フラグを使用して利用できるようです。

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