You Don't Need JavaScript Temporal API (Use Day.js)

Temporal APIが登場してもDay.jsを使うべし

JavaScriptに強力な日時APIであるTemporalが導入され、これまで複雑だった日時の計算やタイムゾーンの処理が標準機能で実装できるようになりました。

これでDay.jsのような軽量ライブラリは完全に不要(You Don't Need Day.js)と思う方もいるかもしれませんが、結論から言うとこれからもDay.jsが必要です。

なぜDay.jsが必要なのか?

Temporalは優れたAPIですが機能が全部入りのライブラリではなく、使い勝手が悪いです。

以下にTemporalよりDay.jsを使うべき6つの理由の記載します。

1. 現在日時の取得方法がわかりやすい

JavaScriptの「new Date()」に該当する現在日時の取得はTemporalでは「Temporal.Now.zonedDateTimeISO()」になります。

…長すぎてわかりづらいですね。

Day.jsなら「dayjs()」で取得できます。

JavaScript
// Temporal
const nowDate = Temporal.Now.zonedDateTimeISO()

// Day.js
const nowDayjs = dayjs()

2. 日付を指定した取得方法もわかりやすい

「2026年6月9日」の日付を作成する場合も、Temporalでは長くなってしまいます。

どちらが良いかは一目瞭然ですね。

JavaScript
// Temporal
const nowDate = Temporal.PlainDate.from('2026-06-09')

// Day.js
const nowDayjs = dayjs('2026-06-09')

3. 日付の加算・減算がわかりやすい

どちらも.add()および.subtract()のメソッドで加算・減算しますが、Temporalはオブジェクトなので入力しづらいです。

Day.jsのほうは「3日追加→add 3 day→add(3, 'day')」のように直感的に書けます。

ちなみに「add(3, 'days')」のように複数形の「days」を指定しても動作します。

JavaScript
// Temporal
const resultTemporal = nowDate.add({ days: 3 }).subtract({ months: 1 })

// Day.js
const resultDayjs = nowDayjs.add(3, 'day').subtract(1, 'month')

4. 2つの日付の差分計算がわかりやすい

「2つの日付が何日離れているか」の計算はTemporalの場合はuntil()またはsince()の中に{ largestUnit: 'day' }を設定して「.days」で日数を取得します。(覚えられない😅)

Day.jsの場合はdiff()を使って「'day'」を指定するだけです。

JavaScript
// Temporal
const d1 = Temporal.PlainDate.from('2026-06-01')
const d2 = Temporal.PlainDate.from('2026-06-07')
const diffTemporal = d1.until(d2, { largestUnit: 'day' }).days
console.log(diffTemporal) // 6

// Day.js
const diffDayjs = dayjs('2026-06-07').diff(dayjs('2026-06-01'), 'day')
console.log(diffDayjs) // 6

5. 日付のフォーマットがしやすい

YYYY-MM-DD HH:mm:ss形式でフォーマットしたい場合は、Day.jsなら「.format('YYYY-MM-DD HH:mm:ss')」でできます。

JavaScript
// Day.js
const formattedDayjs = dayjs().format('YYYY-MM-DD HH:mm:ss')
console.log(formattedDayjs)
// 例: 2026-06-09 12:34:56

TemporalにはYYYY-MM-DD HH:mm:ss形式で出力するためのフォーマット機能が用意されていないため、Intl.DateTimeFormatなどを併用して以下のように書かなくてはなりません😰

JavaScript
const nowDate = Temporal.Now.zonedDateTimeISO()
const formatter = new Intl.DateTimeFormat('ja-JP', {
  year: 'numeric',
  month: '2-digit',
  day: '2-digit',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
  hour12: false
})

const formattedTemporal = formatter.format(nowDate.epochMilliseconds).replace(/\//g, '-') 
console.log(formattedTemporal)
// 例: 2026-06-09 12:34:56

6. タイムゾーン名でタイムゾーンを設定できる

Day.jsにはタイムゾーン名でタイムゾーンを設定できる機能があります。

例えば、日本の場合は以下のようにタイムゾーン名を指定すれば、仮にアメリカから閲覧したとしても日本の日時で表示されます。

JavaScript
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)
const dateDayjs = dayjs.tz('2026-06-07 12:00:00', 'Asia/Tokyo')
document.getElementById('app').textContent = dateDayjs.format(
  'YYYY-MM-DD HH:mm:ss'
)
// 2026-06-07 12:00:00

Temporalはタイムゾーン名だけを単独で指定してタイムゾーンを設定できません。

JavaScriptだけで書く場合は以下のように文字列で書かなければならないので、間違えるリスクがDay.jsよりも高いです。

JavaScript
const dateTemporal = Temporal.ZonedDateTime.from('2026-06-07T12:00:00[Asia/Tokyo]')

// 2026-06-07 T 00:00:00 [Asia/Tokyo]
//  └─①日付─┘ │ └─②時刻─┘ └──③場所──┘
//            └─区切りの文字

まとめ

Temporal APIの登場によって、これまでの処理は、JavaScript標準機能に置き換えることができるようになりました。

しかし、「文字列のパース」や「ユーザーへの柔軟な表示(フォーマット・相対時間)など」という領域においては、依然としてDay.jsのほうが使いやすいです。

この状況は当分の間は変わることはないので、Temporal APIは使わずにDay.jsを使うことを推奨します。