/**
* ログ用タイムスタンプ。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`;
}