≪ Today I learned. RSS購読
公開日
タグ
JavaScript
著者
ダーシノ(@bc_rikko)

Temporalオブジェクトを使った日付・時刻操作

FirefoxがTemporalオブジェクトをExperimentalとしてリリースした。

JavaScriptで日付・時刻を操作するには、Dateオブジェクトを使う。ここでは割愛するが、いろいろな問題・課題があり、Web開発の現場では日付操作ライブラリを使うことが多い。

Temporalオブジェクトを使うことで、JavaScriptによる日付・時刻操作が大幅に簡素化され、dayjs、date-fns(やmoment.js)などのライブラリを使わなくても、同様な機能をネイティブがサポートしてくれるようになる。

2025-02-06時点では、Firefox Nightlyで javascript.options.experimental.temporal フラグを有効にすることで利用可能になる。

Firefoxのabout:configでjavascript.options.experimental.temporalを有効にしている

Temporalオブジェクトの基本

日時を取得する

const now = Temporal.Now.instant()

// RFC9557形式を返す
now.toJSON() // 2025-02-06T00:34:42.328Z

// instantの言語に依存した文字列を返す
now.toLocaleString() // 2/6/2025, 9:34:42 AM

// 指定されたタイムゾーンを使ってRFC9557形式で返す
now.toString() // 2025-02-06T00:34:42.328Z

// タイムゾーンを指定し、その地域の形式の文字列を返す
const timezone = Temporal.Now.timeZoneID() // Asia/Tokyo
now
  .toZonedDateTimeISO(timezone) // = ZonedDateTime
  .toLocaleString() // 2/5/2025, 7:34:42 PM EST

日付の加減算

addsubtractメソッドを使うことで、加減算ができる。

add({ days: 10 })add({ days: -10 })のように負の数を渡すことも可能。

// const today = Temporal.Now.instant()
const today = Temporal.PlainDate.from('2024-01-01')
const added = today.add({ days: 32 })
const subtracted = today.subtract({ days: 32})

console.log(today.toString()) // 2024-01-01
console.log(added.toString()) // 2024-02-02
console.log(subtracted.toString()) // 2023-11-30

また、add()subtract()の引数に、以下のようなオブジェクトを渡すことで日付以外の操作もできる。

{
  years?: number
  months?: number
  days?: number
  hours?: number
  minutes?: number
  seconds?: number
  // ...
}

月初・月末の取得

with()メソッドを使うことで、月初・月末の日付が取得できる。

また、daysInMonthプロパティを参照することで、その月の日数を取得できる。

const today = Temporal.PlainDate.from('2024-02-10')

const startOfMonth = today.with({ day: 1 }) // 2024-02-01

const day = today.daysInMonth // 29
const endOfMonth = today.with({ day }) // 2024-02-29
// or today.with({ day: 31 }) // 2024-02-29