Upgrade to Pro — share decks privately, control downloads, hide ads and more …

書き換えて学ぶTemporal #fukts

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

書き換えて学ぶTemporal #fukts

Avatar for Hiroyuki ANAI

Hiroyuki ANAI

May 07, 2026

More Decks by Hiroyuki ANAI

Other Decks in Programming

Transcript

  1. Dateのつらさ © LayerX Inc. Dateのつらさ タイムゾーンの扱い システムのローカル or UTC ミュータブル

    パースが微妙 new Date("2026-05-07") はUTC、 new Date("2026/05/07") はローカル時刻 月だけが0始まり(1月 → new Date(2026, 0, 1) ) APIが貧弱 ⋯ etc 7
  2. タイムゾーンを型レベルで表現できる 型 用途 Temporal.PlainDate 日付のみ(タイムゾーンなし) Temporal.PlainTime 時刻のみ Temporal.PlainDateTime 日時(タイムゾーンなし) Temporal.ZonedDateTime

    タイムゾーン付き日時 Temporal.Instant 絶対時刻(Unix時刻相当) © LayerX Inc. Temporalとは 型が多いぶん、意図が明確になる 11
  3. 現在時刻の取得: Temporal.Now © LayerX Inc. 型ごとの現在時刻関数 instant() plainDateISO(timeZone?) plainDateTimeISO(timeZone?) plainTimeISO(timeZone?)

    zonedDateTimeISO(timeZone?) timeZoneを省略するとtimeZoneId()が設定される timeZoneId() システムで設定されているタイムゾーンを返す ex) "Asia/Tokyo 19
  4. 値の取得 Date Temporal getFullYear() year getMonth() (0始まり) month (1始まり) getDate()

    day ⋯ ⋯ © LayerX Inc. Dateは関数、Temporalはプロパティ 20
  5. プロパティ 意味 dayOfWeek 曜日(1=月曜、7=日曜) dayOfYear 年通算日(1〜366) weekOfYear 年通算週番号 daysInMonth 月の日数(28〜31)

    daysInYear 年の日数(365 or 366) inLeapYear うるう年かどうか microsecond , nanosecond マイクロ秒/ナノ秒(0〜999) © LayerX Inc. プロパティ 21
  6. 曜日はちょっと注意 © LayerX Inc. 曜日: dayOfWeek Date( getDay() )は0始まり、0=日曜日、6=土曜日 Temporal(

    dayOfWeek )は1始まり、1=月曜日、7=日曜日 故に、 getDay() === dayOfWeek % 7 22
  7. Branded Typeで「業務月」を型で区別 © LayerX Inc. 「業務月」はカレンダー月ではない 現状、コード上で年月は { year: number;

    month: number } で表現されており、 「これ、どっちだっけ ... ?」となりがち PlainYearMonth + Branded Type で 型レベルで業務月とカレンダー月を区別できる: 42