IM即时通讯聊天,5分钟显示一次时间。JS

想在聊天界面想做个和微信一样的时间显示 达到下图这种效果

在这里插入图片描述
百度了一下,发现都是有点不全的,把网上的合并了一下组成下方的js文件 记录一下

1.建议新建一个JS文件 common.js

1.第一个方法是把时间戳转成具体时间日期

/**
* 对Date的扩展,将 Date 转化为指定格式的String。
*
*  月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
*  年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)。
*
*  【示例】:
*  common.formatDate(new Date(), 'yyyy-MM-dd hh:mm:ss.S') ==> 2006-07-02 08:09:04.423
*  common.formatDate(new Date(), 'yyyy-M-d h:m:s.S')      ==> 2006-7-2 8:9:4.18
*  common.formatDate(new Date(), 'hh:mm:ss.S')            ==> 08:09:04.423
*/
var _formatDate = function (date, fmt) {var o = {"M+": date.getMonth() + 1, //月份"d+": date.getDate(), //日"h+": date.getHours(), //小时"m+": date.getMinutes(), //分"s+": date.getSeconds(), //秒"q+": Math.floor((date.getMonth() + 3) / 3), //季度"S": date.getMilliseconds() //毫秒};if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));for (var k in o)if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));return fmt;
};
/**
* 仿照微信中的消息时间显示逻辑,将时间戳(单位:毫秒)转换为友好的显示格式.
*
* 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?(只显示总计7天之内的星期数,即<=-4d);
* 2)7天之外(即>7天)的逻辑:直接显示完整日期时间。
*
* @param  {[long]} timestamp 时间戳(单位:毫秒),形如:1550789954260
* @param {boolean} mustIncludeTime true表示输出的格式里一定会包含“时间:分钟”
* ,否则不包含(参考微信,不包含时分的情况,用于首页“消息”中显示时)
*
* @return {string} 输出格式形如:“刚刚”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式
* @author 即时通讯网([url=http://www.52im.net]http://www.52im.net[/url])
* @since 1.1
*/
export function _getTimeStringAutoShort2 (timestamp, mustIncludeTime){// 当前时间var currentDate = new Date();// 目标判断时间var srcDate = new Date(parseInt(timestamp));var currentYear = currentDate.getFullYear();var currentMonth = (currentDate.getMonth()+1);var currentDateD = currentDate.getDate();var srcYear = srcDate.getFullYear();var srcMonth = (srcDate.getMonth()+1);var srcDateD = srcDate.getDate();var ret = "";// 要额外显示的时间分钟var timeExtraStr = (mustIncludeTime?" "+_formatDate(srcDate, "hh:mm"):"");// 当年if(currentYear == srcYear) {var currentTimestamp = currentDate.getTime();var srcTimestamp = timestamp;// 相差时间(单位:毫秒)var deltaTime = (currentTimestamp-srcTimestamp);// 当天(月份和日期一致才是)if(currentMonth == srcMonth && currentDateD == srcDateD) {// 时间相差60秒以内if(deltaTime < 60 * 1000)ret = "刚刚";// 否则当天其它时间段的,直接显示“时:分”的形式elseret = _formatDate(srcDate, "hh:mm");}// 当年 && 当天之外的时间(即昨天及以前的时间)else {// 昨天(以“现在”的时候为基准-1天)var yesterdayDate = new Date();yesterdayDate.setDate(yesterdayDate.getDate()-1);// 前天(以“现在”的时候为基准-2天)var beforeYesterdayDate = new Date();beforeYesterdayDate.setDate(beforeYesterdayDate.getDate()-2);// 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较,是最为准确的(如果用时间戳差值// 的形式,是不准确的,比如:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,// 这两者间只相差2小时,直接用“deltaTime/(3600 * 1000)” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了)if(srcMonth == (yesterdayDate.getMonth()+1) && srcDateD == yesterdayDate.getDate())ret = "昨天"+timeExtraStr;// -1d// “前天”判断逻辑同上else if(srcMonth == (beforeYesterdayDate.getMonth()+1) && srcDateD == beforeYesterdayDate.getDate())ret = "前天"+timeExtraStr;// -2delse{// 跟当前时间相差的小时数var deltaHour = (deltaTime/(3600 * 1000));// 如果小于或等 7*24小时就显示星期几if (deltaHour <= 7*24){var weekday=new Array(7);weekday[0]="星期日";weekday[1]="星期一";weekday[2]="星期二";weekday[3]="星期三";weekday[4]="星期四";weekday[5]="星期五";weekday[6]="星期六";// 取出当前是星期几var weedayDesc = weekday[srcDate.getDay()];ret = weedayDesc+timeExtraStr;}// 否则直接显示完整日期时间elseret = _formatDate(srcDate, "yyyy/M/d")+timeExtraStr;}}}// 往年else{ret = _formatDate(srcDate, "yyyy/M/d")+timeExtraStr;}return ret;
};
/*** 聊天时间格式化* 规则:*  1. 每五分钟为一个跨度*  2. 今天显示,小时:分钟,例如:11:12*  3. 昨天显示,昨天 小时:分钟 例如:昨天 11:12*  4. 一周内显示,星期几 小时:分钟 例如:星期四 11:12*  5. 日期差大于一周显示,年月日 小时:分钟 例如:2021年9月30日 11:12* @param currentMessageList 传入的当前会话数组* @param sort 传入数组排序:0-数组时间倒序;1-数组时间正序* @param type 五分钟规则区分:0-永远跟上一个显示的时间对比是否超5分钟 ;1-永远两条消息对比是否超5分钟* @returns {Array|null}*/
export function msgTimeFormat(currentMessageList, sort, type) {// console.log('传入的会话数组', currentMessageList)const newMessageList = []const currentFilterList = currentMessageList.filter((item) => {return item.type !== 'showTime'})currentFilterList.forEach((item, index) => {const date = item.time * 1000let showTimeif (index === 0) {//第一条必显示时间showTime = _getTimeStringAutoShort2(date, true)newMessageList.push({payload: {text: showTime},type: 'showTime',//超五分钟显示时间-标识time: item.time})newMessageList.push(item)} else if (index <= currentFilterList.length - 1) {const current = currentFilterList[index].timelet minutesconst showTimeList = newMessageList.filter((item) => {return item.type === 'showTime'})const lastShowTime = showTimeList[showTimeList.length - 1].time//添加的时间且最后一条,用于对比if (type) {const prev = currentFilterList[index - 1].timeminutes = (current - prev) / 60}if (!sort) {minutes = (current - lastShowTime) / 60} else {minutes = (lastShowTime - current) / 60}//超五分if (minutes > 5) {showTime = _getTimeStringAutoShort2(date,  true)newMessageList.push({payload: {text: showTime},type: 'showTime',time: item.time})newMessageList.push(item)} else {newMessageList.push(item)}}})// console.log('最后得到的数组', newMessageList)return newMessageList
}

2.在需要使用的地方引入上述方法

import {msgTimeFormat} from '文件具体位置';//直接把消息列表
messageList=msgTimeFormat(messageList,0,0)

初始列表数组的数据格式
在这里插入图片描述
转换后的数据格式
在这里插入图片描述
展示的时候判断type类型展示payload里面的text就行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/69267.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4 Copilot X震撼来袭!写代码效率10倍提升,码农遭降维打击

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;2T架构师学习资料干货分享 大家好&#xff0c;我是互联网架构师&…

什么是生成器 — 一篇文章让你看懂

嗨嗨&#xff0c;我是小圆 ~ 今天来给大家讲讲什么是生成器 生成器是 Python 初级开发者最难理解的概念之一&#xff0c;虽被认为是 Python 编程中的高级技能&#xff0c;但在各种项目中可以随处见到生成器的身影&#xff0c;你得不得去理解它、使用它、甚至爱上它。 提到生成器…

怎么才能大批量生成原创文章

要大批量生成原创文章并不容易。毕竟&#xff0c;原创文章需要花费较多地时间和精力&#xff0c;才能够展现出高质量、有价值地内容。以下是一些方法可以帮助您大批量生成原创文章&#xff1a;1. 利用关键词通过使用关键词工具&#xff0c;寻找与您网站或品牌相关地长尾关键词。…

新媒体必备小技能——文章生成图片

相信公众号运营大家都不陌生了&#xff0c;与运营和自媒体相关的工作大多都会用到图文编辑&#xff0c;当然好看的排版直接影响读者的阅读体验&#xff01;在日常编辑推文以及制作宣传的过程中&#xff0c;图片是必不可少的重要组成部分&#xff01;96编辑器的一键生成图片功能…

狗屁文章生成器-批量生成原创文章自动发布网站-免费下载

狗屁文章生成器,什么是狗屁文章生成器&#xff0c;狗屁文章生成器从字面意思都能理解出来&#xff0c;就是生成的文章毫无逻辑感&#xff0c;胡乱生成&#xff0c;毫无可读性。只需要输入关键词就能实现狗屁文章生成。狗屁文章生成器。火于2020年某老板喊一员工写3000字原创检讨…

AI文章生成

文章 &#x1f9d0;一、我们在做什么&#x1f971;二、项目详情1.前端&#x1f642;&#xff08;1&#xff09;基本要求&#x1f610;&#xff08;2&#xff09;批量操作功能&#x1f641;&#xff08;3&#xff09;模式选择功能 &#x1f61f;&#xff08;4&#xff09;模型选…

文章生成器-原创文章生成器

在网络营销领域&#xff0c;优质文章是吸引新客户和保留老客户的重要工具。然而&#xff0c;生成高质量且符合SEO优化的文章并不是一件容易的事情。这就是为什么网站文章生成器如今备受欢迎的原因。而在众多的文章生成工具中&#xff0c;147GPT批量生成文章软件是一款非常出色的…

GPT关键词挖掘,自动关键词文章生成

随着互联网的发展&#xff0c;内容营销已成为企业营销策略中不可或缺的一环。有效的关键词文章生成可以帮助企业吸引更多的潜在客户&#xff0c;提高品牌曝光度和转化率&#xff0c;从而实现营销目标。 关键词文章生成是指根据特定的关键词和主题&#xff0c;使用软件工具自动生…

ChatGPT添加插件功能:开始联网集成第三方服务 渐成操作系统

雷递网 乐天 3月24日 人工智能公司OpenAI日前宣布&#xff0c;正为ChatGPT添加对插件的支持——将其与第三方服务集成或允许其访问最新信息的扩展。OpenAI称&#xff0c;正从小处着手&#xff0c;研究现实世界的使用、影响、安全和校准挑战。 “据我们的迭代部署理念&#xff0…

最高年薪近56万!猎聘重磅发布2023最新AIGC就业趋势大数据报告

©作者 | 编辑部 来源 | 新智元 猎聘大数据研究院重磅发布《AIGC就业趋势大数据报告2023》&#xff0c;招聘平均年薪已达40万&#xff0c;博士需求量同比增长超100%。 不用赘述&#xff0c;大家都知道&#xff0c;最近半年ChatGPT是有多么火爆。 随着ChatGPT的全球爆火&…

文心一言与GPT-4比对测试!

Waitlist了三个星期&#xff0c;今天下午终于拿到了百度文心一言的体验资格&#xff0c;于是立刻展开测试。 根据文心一言网页端信息显示&#xff0c;目前最新发版是4月1号的版本&#xff0c;版本号是v1.0.3&#xff0c;应该是从上个月16号发布会以后又做了两版迭代。根据文心一…

2013年各大IT公司研发类笔试题

不可以看见的部分请见http://www.iteblog.com/archives/262 一、百度(武汉地区) 第一部分&#xff1a; 1、描述数据库的简单操作。 2、描述TCP\IP四层模型&#xff0c;并简述之。 3、描述MVC的内容。 第二部分&#xff1a; 1、给出a-z0-9&#xff0c;在其中选择三个字符组…

牛客网2018吉比特校招技术开发类试题分析

最近做了两套笔试题&#xff0c;复习一下错题&#xff0c;有很多地方需要查缺补漏&#xff0c;再谈一下感受总结一下。 2018届吉比特校招技术类笔试B卷 吉比特2018届提前批校园招聘-开发类试卷 一、基础题 1.已知 a 6789x 6789、b 6789x 6790、c 6789x 6791&#xff0c…

大厂可能会问的那些思维题和技术点

精选大厂可能会问的那些思维题和技术点 一、题目一1.1、思路&#xff1a;1.2、代码实现 二、题目二三、const 的含义及实现机制, ,比如 : const int i, 是怎么做到 i 只可读的? ?四、到商店里买 200 的商品返还 100 优惠券( ( 可以在本商店代替现金) ) 。请问实际上折扣是多少…

字节跳动数据分析岗笔试分享笔试形式和内容

字节跳动数据分析岗笔试 笔试形式和内容 由于关于字节跳动数据分析的笔试分享经验较少&#xff0c;参加了字节的笔试后&#xff0c;想做一个记录&#xff0c;就写下了这篇文章。不知道自己笔试过了没有&#xff0c;希望能收到面试邀请吧&#xff0c;同时也希望可以帮助到大家…

计算机技术类社团纳新笔试题示例

计算机协会笔试题 学号&#xff1a;_____________ 姓名: _____________ 说明:如若答题空间不够&#xff0c;可自行另附纸张 printf(“Hello Cast!”): 亲爱的学弟学妹们&#xff0c;欢迎参与浙江理工大学计算机协会的笔试选拔部分。我们作为可爱的学长学姐&#xff0c;十…

10道字节跳动C++/Java笔试真题你能做对几道?3道就赢了80%的竞争者(含答案)

整理了几道字节跳动真题&#xff0c;来试试自己水平有多厉害吧&#xff0c;每题还有答案和详细解答哦。 1、变量a是一个64位有符号的整数&#xff0c;初始值用16进制表示为&#xff1a;0x7FFFFFFFFFFFFFFF。变量b是一个64位有符号的整数&#xff0c;初始值用16进制表示为&#…

chatgpt赋能python:Python:为什么没有桌面图标?

Python&#xff1a;为什么没有桌面图标&#xff1f; 作为一种功能强大的编程语言&#xff0c;Python越来越受到开发人员的欢迎。不过&#xff0c;相对于其他流行的应用程序&#xff0c;开发人员可能会发现一个让他们感到疑惑的问题&#xff1a;为什么Python没有桌面图标&#…

阿里云科学家入选计算机顶会HPCA名人堂,他是什么来头?

记者 | 夕颜 出品 | CSDN&#xff08;ID:CSDNnews&#xff09; 近日&#xff0c;由 IEEE 主办的高性能计算架构国际研讨会 HPCA 公布了最新一期名人堂&#xff08;Hall of Fame&#xff09;名单&#xff0c;来自阿里云基础设施服务器研发团队的科学家蒋晓维成为名人堂新晋成员。…

文本框字数限制

<div class"layui-form-item"><label class"layui-form-label"><span style"color: red">*</span>院校简介&#xff1a;</label><div class"layui-input-block"><textarea class"layui-t…