Files
2026FIFAWorldCup/platform/web/lib/timezone.ts

35 lines
1.1 KiB
TypeScript

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()
);
}