35 lines
1.1 KiB
TypeScript
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()
|
|
);
|
|
}
|