dayjsでタイムゾーン付きのISO 8601を取りたいならformat()、toISOString()じゃない

  • Day.js
  • TypeScript

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

セットアップ

utc/timezoneプラグインはdayjs本体に同梱されている。別パッケージのインストールは不要で、dayjs/plugin/utc・dayjs/plugin/timezoneから読み込むだけでいい。

ターミナル
npm install dayjs

Asia/Tokyoの現在時刻をISO 8601で取得する

オフセット付きのISO 8601形式が欲しいならformat()を使う。引数なしのformat()はデフォルトでYYYY-MM-DDTHH:mm:ssZ(ここでのZはリテラルではなくオフセット表記)を返す。

import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
const nowInTokyo: string = dayjs().tz('Asia/Tokyo').format();
console.log(nowInTokyo);
// 例: 2024-05-21T21:34:12+09:00

フォーマットを固定したい場合は明示的に指定してもいい。

const nowInTokyo: string = dayjs().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ssZ');

toISOString()との違い

toISOString()はDate.prototype.toISOString()と同じ挙動で、常にUTC(末尾Z)を返す。.tz('Asia/Tokyo')で変換した後に呼んでも、タイムゾーンのオフセットは反映されない。

使い分け

  • UTCで保存・比較したい(DB、ログ、API間のやり取り) → toISOString()か.utc().format()
  • 人間が見るタイムゾーン付き表示が欲しい → .tz(zone).format()