社区、文章、评论啊,总是搞这些
前端处理时区展示
需求:
1分钟内数据展示:1秒前
n分钟内数据展示:n分钟前(小于60分钟)
日内数据展示:n小时前
昨天展示:昨天
超过昨天的数据:日期+时分
后端不返回时间戳真的坑啊!!!但必须满足产品!!!!!
前提:
1、以格林威治 (GMT)标准时间为准,简称UTC(Universal Coordinated Time)
2、时间戳无时区之分
3、格林威治时间和本地时间之间的时差new Date().getTimezoneOffset():以分钟为单位
例如:如果时区为 GMT+8, 将返回-480
解决方案:
一:后端直接返回时间戳(1670205600000=2022/12/05 10:00:00(后端返回时间戳))
js
import moment from "moment";
filters: {
formatDate:function (time) {
// 当前时间戳
let now = new Date().getTime();
// 当前凌晨时间戳
let beforeDawn=new Date().toLocaleDateString()
// 当前时间距离当前凌晨时间戳
let during =time - new Date(beforeDawn).getTime();
// 昨天凌晨时间戳
let before =new Date(beforeDawn).getTime() - 86400000;
if (during > 0) {
let newTime = Math.floor((now - time) / 1000);
const m = 60; // 一分钟秒数
const h = m * 60; // 一小时秒数
const d = h * 24; // 一天秒数
const day = Math.floor(newTime / d) | 0,
hour = ((newTime % d) / h) | 0,
minute = (((newTime % d) % h) / m) | 0,
second = ((newTime % d) % h) % m | 0;
return hour ? `${hour} 小时前`: minute? `${minute} 分钟前`: `${second} 秒前`;
} else if (time < before) {
return moment(time).format("DD-MM-YYYY HH:mm");
} else {
//昨天
return "昨天";
}
}
}
二:后端返回时间格式(2022/12/08 09:00或者2022-12-08 09:00)
js
import moment from "moment";
filters: {
formatime: function (str) {
str = str.replace(/\-/g, "/");
let gapTime=new Date().getTimezoneOffset() * 60 * 1000
// time是发布时间
let time = new Date(String(str)).getTime()+gapTime;
// 注意注意!!!!!!!!!!
// 注意注意!!!!!!!!!!
// 如果后端只返回特定时区的时间格式:返回北京时区(GTM+8),要减掉28800000
// let time = new Date(String(str)).getTime()-28800000+gapTime;
// 当前时间戳
let now =new Date().getTime() +gapTime;
// 今天凌晨时间戳
let beforeDawn=new Date(new Date().toLocaleDateString()).getTime()+gapTime
// 发布时间距离当前凌晨时间戳
let during =time -beforeDawn;
// 昨天凌晨时间戳
let before =beforeDawn-86400000;
if (during > 0) {
let newTime = Math.floor((now - time) / 1000);
const m = 60; // 一分钟秒数
const h = m * 60; // 一小时秒数
const d = h * 24; // 一天秒数
const day = Math.floor(newTime / d) | 0,
hour = ((newTime % d) / h) | 0,
minute = (((newTime % d) % h) / m) | 0,
second = ((newTime % d) % h) % m | 0;
return hour? `${hour} 小时前`: minute? `${minute} 分种前`: `${second} 秒前`;
} else if (time < before) {
return moment(time).format("DD-MM-YYYY HH:mm");
} else {
//昨天
return "昨天";
}
},
}
三:坑
ios系统: 只能识别2022/12/08 09:00,不能识别2022-12-08 09:00,需要手动转一下