From 27240d9bfdc0dafa08caea346c6c2b7841ff8ac8 Mon Sep 17 00:00:00 2001 From: Rynco Maekawa Date: Sun, 9 May 2021 06:05:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(route):=20=E4=BF=AE=E5=A4=8D=E8=A7=82?= =?UTF-8?q?=E5=AF=9F=E8=80=85=E7=BD=91=E9=A3=8E=E9=97=BB=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=20Invalid=20Date=20=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=20(#7458)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/routes/guancha/personalpage.js | 44 ++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/routes/guancha/personalpage.js b/lib/routes/guancha/personalpage.js index 30493c9a8..795a07b5f 100644 --- a/lib/routes/guancha/personalpage.js +++ b/lib/routes/guancha/personalpage.js @@ -13,14 +13,48 @@ module.exports = async (ctx) => { }); const list = response.data.data.items; const user_nick = list[0].user_nick; + + /** Get time from relative time in HTML */ function getpass_at(e) { - // 修复数据返回缺少年份 但是 几个小时前的就不想写了 = = - if (e.length === 11) { - const now = new Date(); + const minuteRelativeTime = /(\d+)\s*分钟前/; + const hourRelativeTime = /(\d+)\s*小时前/; + const yesterdayRelativeTime = /昨天\s*(\d+):(\d+)/; + const shortDate = /(\d+)-(\d+)\s*(\d+):(\d+)/; + + // offset to ADD for transforming China time to UTC + const chinaToUtcOffset = -8 * 3600 * 1000; + // offset to ADD for transforming local time to UTC + const localToUtcOffset = new Date().getTimezoneOffset() * 60 * 1000; + // offset to ADD for transforming local time to china time + const localToChinaOffset = localToUtcOffset - chinaToUtcOffset; + + let time; + if (e === '刚刚') { + time = new Date(); + } else if (minuteRelativeTime.test(e)) { + const rel = minuteRelativeTime.exec(e); + time = new Date(Date.now() - parseInt(rel[1]) * 60 * 1000); + } else if (hourRelativeTime.test(e)) { + const rel = hourRelativeTime.exec(e); + time = new Date(Date.now() - parseInt(rel[1]) * 60 * 60 * 1000); + } else if (yesterdayRelativeTime.test(e)) { + const rel = yesterdayRelativeTime.exec(e); + // this time is China time data in local timezone + time = new Date(Date.now() - 86400 * 1000 + localToChinaOffset); + time.setHours(parseInt(rel[1]), parseInt(rel[2]), 0, 0); + // transform back to china timezone + time = new Date(time.getTime() - localToChinaOffset); + } else if (shortDate.test(e)) { + const rel = shortDate.exec(e); + const now = new Date(Date.now() + localToChinaOffset); const year = now.getFullYear(); - e = year + '-' + e; + // this time is China time data in local timezone + time = new Date(year, parseInt(rel[1]) - 1, parseInt(rel[2]), parseInt(rel[3]), parseInt(rel[4])); + // transform back to china timezone + time = new Date(time.getTime() - localToChinaOffset); + } else { + time = new Date(e); } - const time = new Date(e).toLocaleString(); return time; } ctx.state.data = {