Newer
Older
client_dwatch / lib / logger / timestamp.ts
/**
 * ログ用タイムスタンプ。pino 既定の epoch ms は使わない。
 * CLAUDE.md §9.3 に合わせ ISO 8601 JST(+09:00)にする。
 * ホスト TZ に依存しないよう Asia/Tokyo で組み立てる。
 */
const jstStamp = new Intl.DateTimeFormat("en-GB", {
  timeZone: "Asia/Tokyo",
  year: "numeric",
  month: "2-digit",
  day: "2-digit",
  hour: "2-digit",
  minute: "2-digit",
  second: "2-digit",
  hourCycle: "h23",
});

/**
 * 例: `2026-08-27T18:32:20.123+09:00`
 *
 * ミリ秒まで残すのは、秒精度だと同一秒内の複数リクエストの順序が追えず
 * pino 既定(epoch ms)より情報が後退するため。
 * ミリ秒はタイムゾーンに依存しないので Date から直接取る。
 */
export function formatLogTimestamp(date: Date = new Date()): string {
  const parts = Object.fromEntries(
    jstStamp.formatToParts(date).map((part) => [part.type, part.value])
  );
  const ms = String(date.getMilliseconds()).padStart(3, "0");
  return `${parts.year}-${parts.month}-${parts.day}T${parts.hour}:${parts.minute}:${parts.second}.${ms}+09:00`;
}