48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { getReservationTimeZone, reservationTimeZone } from '@/config/reservationConfig'
|
|
|
|
export function formatReservationDateTime(value: string | null | undefined): string {
|
|
if (!value) {
|
|
return '-'
|
|
}
|
|
const date = new Date(value)
|
|
if (Number.isNaN(date.getTime())) {
|
|
return value
|
|
}
|
|
return formatDateTimeInTimeZone(date, getReservationTimeZone())
|
|
}
|
|
|
|
export function formatReservationDateRange(arrivalDate: string, departureDate: string): string {
|
|
return `${arrivalDate} / ${departureDate}`
|
|
}
|
|
|
|
export function formatReservationCurrency(amount: number, currencyCode: string): string {
|
|
return new Intl.NumberFormat('zh-CN', {
|
|
style: 'currency',
|
|
currency: currencyCode,
|
|
maximumFractionDigits: 0,
|
|
}).format(amount)
|
|
}
|
|
|
|
function formatDateTimeInTimeZone(date: Date, timeZone: string): string {
|
|
try {
|
|
return formatDateTimeParts(date, timeZone)
|
|
} catch {
|
|
return formatDateTimeParts(date, reservationTimeZone)
|
|
}
|
|
}
|
|
|
|
function formatDateTimeParts(date: Date, timeZone: string): string {
|
|
const parts = new Intl.DateTimeFormat('en-GB', {
|
|
timeZone,
|
|
year: 'numeric',
|
|
month: '2-digit',
|
|
day: '2-digit',
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
second: '2-digit',
|
|
hourCycle: 'h23',
|
|
}).formatToParts(date)
|
|
const valueByType = Object.fromEntries(parts.map((part) => [part.type, part.value]))
|
|
return `${valueByType.year}-${valueByType.month}-${valueByType.day} ${valueByType.hour}:${valueByType.minute}:${valueByType.second}`
|
|
}
|