fix: 修复 formatDatetime 函数处理跨午夜时间显示问题
重构日期时间格式化逻辑,使用 dayjs 库替代字符串切片以提升健壮性。新增对跨午夜至 00:00 情况的特殊处理,将其显示为 24:00,使时间区间表达更符合日常习惯。
Showing
1 changed file
with
25 additions
and
5 deletions
| ... | @@ -71,11 +71,31 @@ const strExist = (array, str) => { | ... | @@ -71,11 +71,31 @@ const strExist = (array, str) => { |
| 71 | return exist.length > 0 | 71 | return exist.length > 0 |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | -const formatDatetime = (data) => { // 格式化日期 | 74 | +const formatDatetime = (data) => { |
| 75 | - let begin_time = data?.begin_time.slice(0, -6); | 75 | + if (!data || !data.begin_time || !data.end_time) return ''; |
| 76 | - let end_time = data?.end_time.slice(0, -6); | 76 | + |
| 77 | - let str = begin_time + ' ' + end_time; | 77 | + const normalize = (timeStr) => { |
| 78 | - return `${str.split(' ')[0]} ${str.split(' ')[1]}-${str.split(' ')[3]}`; | 78 | + if (!timeStr) return ''; |
| 79 | + let clean = timeStr.split('+')[0]; | ||
| 80 | + clean = clean.split('Z')[0]; | ||
| 81 | + clean = clean.trim().replace(/\s+/, 'T'); | ||
| 82 | + return clean; | ||
| 83 | + }; | ||
| 84 | + | ||
| 85 | + const start = dayjs(normalize(data.begin_time)); | ||
| 86 | + const end = dayjs(normalize(data.end_time)); | ||
| 87 | + | ||
| 88 | + if (!start.isValid() || !end.isValid()) return ''; | ||
| 89 | + | ||
| 90 | + const isNextDayMidnight = | ||
| 91 | + end.diff(start, 'day') === 1 && | ||
| 92 | + end.hour() === 0 && | ||
| 93 | + end.minute() === 0 && | ||
| 94 | + end.second() === 0; | ||
| 95 | + | ||
| 96 | + const endTimeText = isNextDayMidnight ? '24:00' : end.format('HH:mm'); | ||
| 97 | + | ||
| 98 | + return `${start.format('YYYY-MM-DD')} ${start.format('HH:mm')}-${endTimeText}`; | ||
| 79 | } | 99 | } |
| 80 | 100 | ||
| 81 | export { formatDate, wxInfo, hasEllipsis, parseQueryString, strExist, formatDatetime }; | 101 | export { formatDate, wxInfo, hasEllipsis, parseQueryString, strExist, formatDatetime }; | ... | ... |
-
Please register or login to post a comment