69 lines
2.2 KiB
JavaScript
69 lines
2.2 KiB
JavaScript
/**
|
|||
|
|
* 时间格式化工具
|
||
|
|
*
|
||
|
|
* 背景:会话列表模板(components/conversation-item/index.wxml)读取
|
||
|
|
* `conversation.lastMessageAtText` 做展示,但此前全仓无任何地方计算该字段,
|
||
|
|
* 导致会话列表时间恒为空;聊天页 pages/chat/chat.ts 又自带一份 _formatTime。
|
||
|
|
* 本模块把这两处时间格式化收敛到一处,避免重复实现。
|
||
|
|
*
|
||
|
|
* 约定:后端时间字段一律为 epoch 毫秒(number),与
|
||
|
|
* types/index.d.ts 的 `lastMessageAt?: number` / `Message.sentAt: number` 对齐。
|
||
|
|
*/
|
||
|
|
|
||
|
|
/** 补零 */
|
||
|
|
function pad2(n) {
|
||
|
|
return n < 10 ? '0' + n : String(n);
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 归一化为 Date,非法输入返回 null */
|
||
|
|
function toDate(ts) {
|
||
|
|
if (ts === null || ts === undefined || ts === '') return null;
|
||
|
|
var d = ts instanceof Date ? ts : new Date(Number(ts));
|
||
|
|
return isNaN(d.getTime()) ? null : d;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 同一天 */
|
||
|
|
function isSameDay(a, b) {
|
||
|
|
return a.getFullYear() === b.getFullYear()
|
||
|
|
&& a.getMonth() === b.getMonth()
|
||
|
|
&& a.getDate() === b.getDate();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 会话列表时间:刚刚 / HH:mm / 昨天 / M/D / YYYY/M/D
|
||
|
|
* @param {number|Date} ts
|
||
|
|
* @returns {string}
|
||
|
|
*/
|
||
|
|
function formatConversationTime(ts) {
|
||
|
|
var d = toDate(ts);
|
||
|
|
if (!d) return '';
|
||
|
|
var now = new Date();
|
||
|
|
var diff = now.getTime() - d.getTime();
|
||
|
|
if (diff >= 0 && diff < 60 * 1000) return '刚刚';
|
||
|
|
if (isSameDay(d, now)) return pad2(d.getHours()) + ':' + pad2(d.getMinutes());
|
||
|
|
var yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
||
|
|
if (isSameDay(d, yesterday)) return '昨天';
|
||
|
|
if (d.getFullYear() === now.getFullYear()) return (d.getMonth() + 1) + '/' + d.getDate();
|
||
|
|
return d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 聊天气泡时间:今天 HH:mm(省略日期),否则 M/D HH:mm
|
||
|
|
* 与 pages/chat/chat.ts 原有逻辑保持一致。
|
||
|
|
* @param {number|Date} ts
|
||
|
|
* @returns {string}
|
||
|
|
*/
|
||
|
|
function formatMessageTime(ts) {
|
||
|
|
var d = toDate(ts);
|
||
|
|
if (!d) return '';
|
||
|
|
var now = new Date();
|
||
|
|
var hm = pad2(d.getHours()) + ':' + pad2(d.getMinutes());
|
||
|
|
if (isSameDay(d, now)) return hm;
|
||
|
|
return (d.getMonth() + 1) + '/' + d.getDate() + ' ' + hm;
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
formatConversationTime: formatConversationTime,
|
||
|
|
formatMessageTime: formatMessageTime,
|
||
|
|
};
|