/**
|
* 业务时间解析:只接受毫秒时间戳或 ISO-8601 文本,缺失或非法时间不伪装为当前时间。
|
*
|
* <p>同时接受两种形态,是因为后端目前并不统一:手写 Map 的时间字段是毫秒数,
|
* 而 Instant 类型的 VO 属性走 ISO 文本(见 KNOWN-GAPS「时间字段两种形态」)。
|
*/
|
export function businessTime(value: unknown): number | null {
|
if (typeof value === 'number') {
|
return Number.isFinite(value) && Number.isFinite(new Date(value).getTime()) ? value : null
|
}
|
if (typeof value === 'string' && value.trim()) {
|
const parsed = new Date(value.trim()).getTime()
|
return Number.isFinite(parsed) ? parsed : null
|
}
|
return null
|
}
|
|
/** 将业务时间按浏览器本地时区展示,保留毫秒精度。 */
|
export function formatBusinessTime(value: unknown): string {
|
const time = businessTime(value)
|
if (time === null) return '-'
|
const date = new Date(time)
|
const pad = (part: number, length = 2) => String(part).padStart(length, '0')
|
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}`
|
}
|
|
/** 只展示到分钟的紧凑时间,用于设备列表与候选列表。 */
|
export function formatBusinessMinute(value: unknown): string {
|
const date = businessDate(value)
|
if (date === null) return '-'
|
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`
|
}
|
|
/** 只展示月日与时分秒,用于实时监控卡片。 */
|
export function formatBusinessClock(value: unknown): string {
|
const date = businessDate(value)
|
if (date === null) return '-'
|
return `${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`
|
}
|
|
function businessDate(value: unknown): Date | null {
|
const time = businessTime(value)
|
return time === null ? null : new Date(time)
|
}
|
|
function pad(part: number): string {
|
return String(part).padStart(2, '0')
|
}
|