fix(FEAT-MO-001): 修正概览时间时区显示

This commit is contained in:
2026-08-24 23:08:46 +08:00
parent 1e80e7d2de
commit b1310fb86d
10 changed files with 139 additions and 4 deletions
+18
View File
@@ -0,0 +1,18 @@
import { describe, expect, it } from 'vitest';
import { formatShanghaiDateTime, formatShanghaiTime } from './datetime';
describe('A 股时间显示格式化', () => {
it('将 UTC ISO 时间转换为上海时区的完整日期时间', () => {
expect(formatShanghaiDateTime('2026-08-24T14:16:26.813Z')).toBe('2026-08-24 22:16:26');
});
it('将 UTC ISO 时间转换为上海时区的时分秒', () => {
expect(formatShanghaiTime('2026-08-24T14:16:26.813Z')).toBe('22:16:26');
});
it('收到空值或非法日期时返回占位符', () => {
expect(formatShanghaiDateTime(undefined)).toBe('—');
expect(formatShanghaiTime('not-a-date')).toBe('—');
});
});
+45
View File
@@ -0,0 +1,45 @@
const SHANGHAI_TIME_ZONE = 'Asia/Shanghai';
type DatePart = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second';
function getShanghaiDateParts(value: string | undefined): Record<DatePart, string> | null {
if (!value) return null;
const date = new Date(value);
if (Number.isNaN(date.getTime())) return null;
const parts = new Intl.DateTimeFormat('en-CA', {
timeZone: SHANGHAI_TIME_ZONE,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hourCycle: 'h23',
}).formatToParts(date);
const result = Object.fromEntries(
parts
.filter((part): part is Intl.DateTimeFormatPart & { type: DatePart } =>
['year', 'month', 'day', 'hour', 'minute', 'second'].includes(part.type),
)
.map((part) => [part.type, part.value]),
) as Partial<Record<DatePart, string>>;
if (Object.values(result).some((part) => !part)) return null;
return result as Record<DatePart, string>;
}
/** A 股页面统一使用上海时区,接口仍保留标准 UTC ISO 时间。 */
export function formatShanghaiDateTime(value: string | undefined): string {
const parts = getShanghaiDateParts(value);
return parts
? `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}:${parts.second}`
: '—';
}
export function formatShanghaiTime(value: string | undefined): string {
const parts = getShanghaiDateParts(value);
return parts ? `${parts.hour}:${parts.minute}:${parts.second}` : '—';
}