======================================================

以下规则是在体验微信操作后,推测出来的规则,可能存在一些不准确的表述

======================================================

参考基准

当处于正在聊天时,聊天内容比聊天时间更为重要,尽量避免时间和发送状态对聊天内容的干扰,简化界面,仅保留最核心的信息:发送者、发送内容。

Badge(未读消息数量)

当消息数量达到三位数时(也即消息数量 > 99),显示…而非数字,缓解/减轻强迫症患者的心理压力

时间戳显示

时间戳由客户端自行处理,时间戳的显示根据不同的场景进行显示,可参考下面几种典型的使用场景,但无论怎么显示,消息之间超过5分钟都需要显示时间戳了。

###点击聊天列表,进入聊天详情时(单聊或群聊)

1)获取数据

获取最近最多20条数据(20条为一页数据,超过20条时只取最近的20条,少于20条时有多少取多少)

2)显示数据

获取第一条消息的接收时间,然后将这个时间戳插入到界面并记录下来(假设使用变量lastShowTimeStamp进行记录),然后将消息按时间戳(从小到大排序,老消息在前新消息在后),追加到界面中,但需要注意时间戳的显示规则。

循环遍历每条消息时,需要判断该消息的接收时间与最后一次显示时间戳的时间间隔,当大于5分钟(300ms)时则再追加一条时间戳,同时更新lastShowTimeStamp的值。

###时间戳的显示规则

一天内的消息显示为:“昨天 时:分”

二天至七天内显示为:“星期X 时:分”

当大于7天时显示为:“YYYY年X月X日时:分”

时、分不足二位时,前面用0补齐,月、日不足二位时不补位。如:2016年7月13日 09:22,注意计算天数是要算天,不能拿毫秒进行比较。否则昨天上午的消息,在今天下午看时将会变成“星期X 09:10”,正确的应该是“昨天 09:10”

示例截图如下:

###聊天ing

当收到新消息时,判断当前收到的消息与lastShowTimeStamp之间的间隔,大于5分钟时就显示时间戳,同时更新lastShowTimeStamp的值为当前新消息收到的时间戳。

会出现一种情况,当5分钟内,消息很频繁而导致消息量达到100条,那么这一千条数据中间是没有任何时间戳的。如果退出聊天界面再重新进入时,参考第一条规则。

示例截图:

###当向下拉取消息时

向上拉取消息时,获取向上的20条数据(一页,不足一页时有多少取多少),然后根据第一条的规则来显示。

先显示时间戳,然后判断每一条时间戳与上一次显示的时间戳进行比较,间隔大于5分钟时显示新的时间戳,唯一与第一条规则不同的是,此时不要更新lastShowTimeStamp的值。因为lastShowTimeStamp的值是用来判断新消息的,老消息需要判断的话使用一个临时变量记录即可,拉取并显示完一页数据就丢弃掉了。

会出现一种情况,就是向上拉取消息时,你会遇到同一分钟内发送的消息各有一个时间戳,而且时间戳是相同的。出现的原因是消息分属在二页内了

示例截图如下:

###删除单条消息时

删除一条消息时,如果被删除的消息上一条是时间戳,而下一条不是一条消息记录时就将时间戳一并删除掉。

这样会导致一种情况,时间戳被删除掉之后,lastShowTimeStamp并没有进行更新,如果此时再接收到新消息时,它不会再显示时间戳,直到新消息超过5分钟的间隔才重新显示时间戳并更新lastShowTimeStamp的值。删除完消息后检查当前消息数,少于一页时自动再加载上一页数据,直至没有消息可供加载。

示例截图如下(第一张图是正常的,第二张图是非正常的,退出聊天重新进入或等5分钟之后便可恢复正常):

###批量删除消息时

规则与单删类似,唯一的不同的,当选中某一行时需要向上、向下遍历。

向上遍历时:

如果上一条消息是未选中状态,中止向上查找;

如果上一条消息是选中状态,继续向上不断查找,直到找到未选中消息(中止)、找到时间戳(记录下该时间戳的位置,然后向下遍历);

向下遍历时:

如果下一条消息是未选中状态,记录的时间戳位置清除,中止向下查找;

如果下一条消息是选中状态,继续向下不断查找,直到找到未选中消息(中止并清除)、找到时间戳(成功找到,也就是向前是一个时间戳,向后也是一个时间戳或是最后一条消息也记录向上查找到的时间戳)

注:批量删除时,一次最多能选择删除100条数据。消息删除后,需要判断当前消息数量是否够一页(20条),不够就再向上加载一页数据(20条);

在点击删除时,一次性进行删除操作,避免遍历影响性能。

示例截图如下:

转载于:https://www.cnblogs.com/meteoric_cry/p/5699160.html

聊天IM的时间戳显示规则相关推荐

  1. android 开源聊天控件,聊天IM的时间戳显示规则

    ====================================================== 以下规则是在体验微信操作后,推测出来的规则,可能存在一些不准确的表述 ========== ...

  2. Android/java 仿微信聊天列表时间显示规则

    微信时间显示规则: 今天: HH:mm ,例 8:28 昨天: 昨天 HH:mm, 例 昨天 9:27 近7天 : 星期X HH:mm ,例 星期一 6:25 今年: M月d日 HH:mm 例 3月2 ...

  3. 干货:Wireshark使用技巧-显示规则

    " 介绍Wireshark对已有报文的显示进行控制的显示规则." 之前对Wireshark抓包时使用的过滤规则进行了介绍,本文介绍对已有报文的显示进行控制的显示规则.掌握了显示规则 ...

  4. 网游服务端php5.1时间戳格式化,php格式化时间戳显示友好时间的简单示例

    这篇文章主要为大家详细介绍了php格式化时间戳显示友好时间的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! 在项目中时间一律显示为2014-1 ...

  5. Wireshark技巧-过滤规则和显示规则

    From: http://www.cnblogs.com/icez/p/3973873.html Wireshark是一个强大的网络协议分析软件,最重要的它是免费软件. 过滤规则 只抓取符合条件的包, ...

  6. 商城文档、商城原型、全局说明、o2o商城、汽车商城、业务逻辑、商城架构图、流程图、版本规划、需求说明、活动、预约、会员、prd、交互说明、页面说明、显示规则、字段说明、操作规则、数据来源、需求规划

    商城文档.商城原型.全局说明.o2o商城.汽车商城.业务逻辑.商城架构图.流程图.版本规划.需求说明.活动.预约.会员.prd.交互说明.页面说明.显示规则.字段说明.操作规则.数据来源.需求规划 A ...

  7. Android运营商名字显示规则

    可以分为两大类: (1)网络名称:PLMN(注册的mccmnc对应的网络名称)和SPN(卡中的一个文件:EF_SPN,fid是6F46.读取SPN首先要看看SST中是否有这个栏位) (2)SIM卡名称 ...

  8. 完美解决deepin-wine-wechat微信黑块以及聊天输入框中文字体显示为竖条的问题(亲测有效!)

    一. 解决显示微信黑块的问题 1. 安装wmctrl sudo apt-get install wmctrl 2. 使用wmctrl命令查看系统正在运行的窗口 打开微信聊天窗口后会有黑块显示,此时如下 ...

  9. 安卓显示时间java,Android/java 仿微信聊天列表时间显示规则

    往年: yyyy年M月d日 HH:mm 例 2018年6月9日 6:52 public static String getTimeString(Long timestamp) { String res ...

最新文章

  1. C# 索引器(Indexer)
  2. 互信息的数学解释以及matlab编程
  3. boost::core::has_single_bit的测试
  4. 总结一些linux目录结构和终端命令
  5. NIOS生成Nios libaray
  6. 第三章用sql语句操作数据
  7. (笔记)网络技术学习交流会
  8. field-symbols的用法[转]
  9. Python学习 :函数
  10. (转)SQL Server当中生成一定范围的随机数
  11. 最新计算机二级c语言程序设计题库,计算机二级C语言编程题库(100题
  12. JUCE学习笔记03-Slider、Listener、Label类
  13. 上海PHP09期,平均薪资10246元,毕业03个工作日,就业率达62.50%
  14. requires INJECT_EVENTS permission
  15. JAVA设计模式--建造者模式
  16. 程序员必备的思维能力:抽象思维
  17. 贝叶斯统计为什么优于频率统计?
  18. 思维导图(一):高效的思维工具
  19. 分区 与 bios 笔记本 tips
  20. 什么是大数据4v 指的是哪四个

热门文章

  1. Redis入门之 redis set集合的操作
  2. 源码方式安装最新版本snmp的过程
  3. Kotlin StandardKt 标准库源码走一波
  4. SQL Server 实现递归获取层级数据
  5. samba 服务器手动挂载自动挂载
  6. Go 编码建议——风格篇
  7. PJ可能会用到的动态规划选讲-学习笔记
  8. 某些数组和字符串类型转换(转)
  9. 【网络】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
  10. iOS开发 字符串的转化 小技巧