Java仿微信时间显示
需求
微信聊天消息时间显示说明
1、当天的消息,以每5分钟为一个跨度的显示时间;
2、消息超过1天、小于1周,显示星期+收发消息的时间;
3、消息大于1周,显示手机收发时间的日期。
考虑了一下,需求变更如下:
- 当天跨度为5分钟
- 当天之前的跨度统一10分钟
效果类似下图:
代码实现
1.dto类设计
数据库实际仅用一个字段存储时间:
LocalDateTime createTime
为了便于之后的跨度计算加上几个辅助字段,这些字段不存入数据库,所以只写在dto类中,而不是entity类中。
相关字段如下
//消息实际发送时间
private LocalDateTime createTime;
//格式化时间
private String dealTime;
//用于格式化时间的分组
// 5:今天 4:昨天 3:一周以内 2:月 1:年
private Byte flagTime;
//消息间每隔一个时间跨度存放一次,也是最后要取的时间值
private String resultTime;
2.controller层
public PageResponse<PrivateMessageDTO> getDetailPrivateLetterByTime(@RequestBody @Validated PageQuery<PrivateMessageDTO> request) {
//此处用户获取用户的消息记录
PageResponse<PrivateMessageDTO> page = privateMessageService.getDetailPrivateLetter(request);
//对消息记录的时间进行处理
return privateMessageService.getDetailPrivateLetterByTime(page);
}
3.service层
// 时间处理函数
@Override
public PageResponse<PrivateMessageDTO> getDetailPrivateLetterByTime(PageResponse<PrivateMessageDTO> request) {
List<PrivateMessageDTO> list = request.getListData();
for(PrivateMessageDTO temp:list){
//时间格式化处理,如 将2000-01-01 12:00:00 转换成 年月日的格式
//getTimeString 时间格式化函数,之后会给出代码
String result = getTimeString(temp.getCreateTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
//对时间进行标记,为消息做一个归类
//比如 消息发送时间在昨天以前,又在一周以内的归到一组中
// 5:今天 4:昨天 3:一周以内 2:月 1:年
if(result.contains("年")){
temp.setFlagTime((byte) 1);
}else if(result.contains("月")){
temp.setFlagTime((