前端处理时区展示(xx秒前,xx分钟前,xx小时,昨天,YYYY-MM-DD HH:MM)

274 阅读1分钟

社区、文章、评论啊,总是搞这些

前端处理时区展示

需求:

1分钟内数据展示:1秒前

n分钟内数据展示:n分钟前(小于60分钟)

日内数据展示:n小时前

昨天展示:昨天

超过昨天的数据:日期+时分

后端不返回时间戳真的坑啊!!!但必须满足产品!!!!!

前提:

1、以格林威治 (GMT)标准时间为准,简称UTC(Universal Coordinated Time)

2、时间戳无时区之分

3、格林威治时间和本地时间之间的时差new Date().getTimezoneOffset():以分钟为单位

例如:如果时区为 GMT+8, 将返回-480

image-20221205093632139.png

解决方案:

一:后端直接返回时间戳(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,需要手动转一下