import { format } from 'date-fns'; import { toZonedTime } from 'date-fns-tz'; export const TAIPEI_TIME_ZONE = 'Asia/Taipei'; const defaultFormatter = 'yyyy/MM/dd HH:mm:ss'; function assertIsoDate(utcDateString: string): Date { const sourceDate = new Date(utcDateString); if (Number.isNaN(sourceDate.getTime())) { throw new Error(`非法的 UTC 時間戳:${utcDateString}`); } return sourceDate; } export function toTaipeiDate(utcDateString: string): Date { const source = assertIsoDate(utcDateString); return toZonedTime(source, TAIPEI_TIME_ZONE); } export function formatToTaipeiTime(utcDateString: string, formatString = defaultFormatter): string { const taipeiDate = toTaipeiDate(utcDateString); return format(taipeiDate, formatString); } export function isTodayTaipei(utcDateString: string, now = new Date()): boolean { const target = toTaipeiDate(utcDateString); const local = toZonedTime(now, TAIPEI_TIME_ZONE); return ( target.getFullYear() === local.getFullYear() && target.getMonth() === local.getMonth() && target.getDate() === local.getDate() ); }