@@ -1,3 +1,40 @@
|
||||
const MS_MINUTE = 60_000;
|
||||
const MS_HOUR = 60 * MS_MINUTE;
|
||||
const MS_DAY = 24 * MS_HOUR;
|
||||
|
||||
function shanghaiParts(input: string | Date) {
|
||||
const d = input instanceof Date ? input : new Date(input);
|
||||
if (Number.isNaN(d.getTime())) return null;
|
||||
const sh = new Date(d.getTime() + 8 * 60 * 60 * 1000);
|
||||
const p = (n: number) => String(n).padStart(2, '0');
|
||||
return {
|
||||
year: sh.getUTCFullYear(),
|
||||
month: p(sh.getUTCMonth() + 1),
|
||||
day: p(sh.getUTCDate()),
|
||||
hour: p(sh.getUTCHours()),
|
||||
minute: p(sh.getUTCMinutes()),
|
||||
};
|
||||
}
|
||||
|
||||
/** 核销走马灯时间:24 小时内相对时间,超过则显示具体时间 */
|
||||
export function formatRedeemRelativeTime(input?: string | Date | null): string {
|
||||
if (input == null || input === '') return '刚刚';
|
||||
const at = input instanceof Date ? input : new Date(input);
|
||||
if (Number.isNaN(at.getTime())) return '刚刚';
|
||||
const diffMs = Date.now() - at.getTime();
|
||||
if (diffMs < MS_MINUTE) return '刚刚';
|
||||
if (diffMs < MS_HOUR) return `${Math.floor(diffMs / MS_MINUTE)}分钟前`;
|
||||
if (diffMs < MS_DAY) return `${Math.floor(diffMs / MS_HOUR)}小时前`;
|
||||
const parts = shanghaiParts(at);
|
||||
if (!parts) return '刚刚';
|
||||
const nowParts = shanghaiParts(new Date());
|
||||
const datePrefix =
|
||||
nowParts && parts.year === nowParts.year
|
||||
? `${parts.month}-${parts.day}`
|
||||
: `${parts.year}-${parts.month}-${parts.day}`;
|
||||
return `${datePrefix} ${parts.hour}:${parts.minute}`;
|
||||
}
|
||||
|
||||
/** 格式化为 Asia/Shanghai:2026-08-03 15:14:30(不依赖 Intl,兼容微信小程序) */
|
||||
export function formatShanghaiDateTime(input?: string | Date | null): string {
|
||||
if (input == null || input === '') return '—';
|
||||
|
||||
Reference in New Issue
Block a user