![仿微信的IM谈天时间显示花样(含iOS/Android/Web实现)[图文+源码]‘星空官方,星空赛事,星空百家乐,星空平台’(图1) 星空官方,星空赛事,星空百家乐,星空平台](/uploads/ueditor/20260601/img_20260601011603_27c011199489cd4ede.webp)
围绕仿微信的IM谈天时间显示花样(含iOS/Android/Web实现)[图文+源码]‘星空官方,星空赛事,星空百家乐,星空平台’,本文从实际体验和常见需求出发重新整理相关内容。// 用目的日期的“月”和“天”跟上方盘算出来的“昨天”举行比力,是最为准确的(如果用时间戳差值// 的形式,是禁绝确的,好比:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,// 这两者间只相差2小时,直接用“delta/3600” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了)if(srcMonth == yesterdayMonth && srcDay == yesterdayDay)ret = [NSStringstringWithFormat:@"昨天%@", timeExtraStr];// -1d// “前天”判断逻辑同上elseif(srcMonth == beforeYesterdayMonth && srcDay == beforeYesterdayDay)ret = [NSStringstringWithFormat:@"前天%@", timeExtraStr];// -2delse{// 跟当前时间相差的小时数longdeltaHour = (delta/3600);// 当小于或等 7*24小时就显示星期几if(deltaHour。这些例子要么简陋粗暴(有逻辑bug硬伤)、要么并不完整(可能只是随手写的练手代码,并不适合放到产物中),所以本着做技术字斟句酌的态度,没有现成的轮子可用,那就只能造轮子了。
那么,按怎样的显示逻辑来实现呢?* 提示:本文中的代码实现,是从 RainbowChat 和 RainbowChat-Web 两个IM产物中扒出来简化后的效果,是基于完全相同的算法逻辑划分用OC、Java和JavaScript实现的。作为移动端IM的王者,微信无疑到处是标杆,所以本次的消息时间显示花样,直接参照微信的实现逻辑准没错(随大流虽然没个性,但不至于非主流)。NSIntegerbeforeYesterdayMonth=[beforeYesterdayComponents month];NSIntegerbeforeYesterdayDay=[beforeYesterdayComponents day];好了,规则已经摸清,下面将直接上代码。
![仿微信的IM谈天时间显示花样(含iOS/Android/Web实现)[图文+源码]‘星空官方,星空赛事,星空百家乐,星空平台’(图2) 星空官方,星空赛事,星空百家乐,星空平台](/uploads/ueditor/20260601/img_20260601011603_28843ffa39f4a1cfd0.jpg)
![仿微信的IM谈天时间显示花样(含iOS/Android/Web实现)[图文+源码]‘星空官方,星空赛事,星空百家乐,星空平台’(图3) 星空官方,星空赛事,星空百家乐,星空平台](/uploads/ueditor/20260601/img_20260601011605_4b8a8b3e149d2a2423.webp)
5、Android平台上的代码实现(尺度Java)5.1 完整源码/*** 返回指定pattern样的日期时间字符串。** @param dt* @param pattern* @return 如果时间转换乐成则返回效果,否则返回空字符串""* @author 即时通讯网([url=http://www.52im.net]http://www.52im.net[/url])*/publicstaticString getTimeString(Date dt, String pattern){try{SimpleDateFormat sdf = newSimpleDateFormat(pattern);//"yyyy-MM-dd HH:mm:ss"sdf.setTimeZone(TimeZone.getDefault());// 要分外显示的时间分钟NSString*timeExtraStr = (includeTime?[TimeTool getTimeString:dt format:@" HH:mm"]:@"");如您以为有用,可以改改直接用于您的产物,如您有更好的建议请直接回复和评论。代码仅供参考,不足之外,还请见谅!(本文同步公布于:http://www.52im.net/thread-2371-1-1.html)2、对应文章《用于IM中图片压缩的Android工具类源码,效果可媲美微信 [附件下载]》《高仿Android版手机QQ可拖拽未读数小气泡源码 [附件下载]》《Android谈天界面源码:实现了谈天气泡、心情图标(可翻页) [附件下载]》《高仿Android版手机QQ首页侧滑菜单源码 [附件下载]》《分享java AMR音频文件合并源码,全网最全》《Android版高仿微信谈天界面源码 [附件下载]》《高仿手机QQ的Android版锁屏谈天消息提醒功效 [附件下载]》《高仿iOS版手机QQ录音及振幅动画完整实现 [源码下载]》《Android端社交应用中的评论和回复功效实战分享[图文+源码]》《Android端IM应用中的@人功效实现:仿微博、QQ、微信,零入侵、高可扩展[图文+源码]》3、看看微信中谈天消息的时间显示规则先来看看微信中谈天消息的时间显示成什么样:微信主页“消息”界面谈天界面(注意谈天界面中默认带了“时:分”的显示)来自微信官方入口对谈天消息时间显示的规则说明:▲ 该规则的界说,主要是2、3条(本图引用自微信官方入口FAQ文档)4、总结一下微信中谈天消息的时间显示逻辑参见第3节中的截图和微信官方入口的说明,我们可以总结出微信对于谈天消息时间显示的规则。① 微信对于谈天消息时间显示的规则总结如下(首页“消息”界面):1)当谈天消息时间为一周之内时:当天的消息显示为“小时:分钟”形式,然后是“昨天”、“前天”,然后就是“星期几”这个样子;这两天正在继续开发RainbowChat-Web产物,所以正需要这样的代码。
![仿微信的IM谈天时间显示花样(含iOS/Android/Web实现)[图文+源码]‘星空官方,星空赛事,星空百家乐,星空平台’(图4) 星空官方,星空赛事,星空百家乐,星空平台](/uploads/ueditor/20260601/img_20260601011605_6dffdfe32c04e6dd1f.webp)
所以,市面上险些所有的IM都市对谈天消息的时间显示格化做人性化处置惩罚,从而提高用户实际体验(使用感受会显着友好)。但经由在即时通讯网的论坛和技术交流群里询问,以及网上的所谓仿微信例子,都不切合要求。// -1d}// “前天”判断逻辑同上elseif(srcMonth == (beforeYesterdayDate.get(GregorianCalendar.MONTH)+1)&& srcDay == beforeYesterdayDate.get(GregorianCalendar.DAY_OF_MONTH)){ret = "前天"+timeExtraStr;// -2d}else{// 跟当前时间相差的小时数longdeltaHour = (delta/(3600* 1000));}catch(Exception e){return"";returnsdf.format(dt);*/+ (long) getIOSTimeStamp_l:(NSDate*)dat;@end源文件TimeTool.m:#import "TimeTool.h"@implementationTimeTool// 模仿微信的逻辑,显示一小我私家性化的时间字串+ (NSString*)getTimeStringAutoShort2:(NSDate*)dt mustIncludeTime:(BOOL)includeTime{NSString*ret = nil;NSCalendar*calendar = [NSCalendarcurrentCalendar];// 前天(以“现在”的时候为基准-2天)GregorianCalendar beforeYesterdayDate = newGregorianCalendar();yesterdayDate.add(GregorianCalendar.DAY_OF_MONTH, -1);beforeYesterdayDate.add(GregorianCalendar.DAY_OF_MONTH, -2);// 用目的日期的“月”和“天”跟上方盘算出来的“昨天”举行比力,是最为准确的(假如用时间戳差值// 的形式,是禁绝确的,好比:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,// 这两者间只相差2小时,直接用“delta/(3600 * 1000)” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了)if(srcMonth == (yesterdayDate.get(GregorianCalendar.MONTH)+1)&& srcDay == yesterdayDate.get(GregorianCalendar.DAY_OF_MONTH)){ret = "昨天"+timeExtraStr;// 当小于 7*24小时就显示星期几if(deltaHour < 7*24){String[] weekday = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};// 取出当前是星期几String weedayDesc = weekday[gcSrc.get(GregorianCalendar.DAY_OF_WEEK)-1];NSIntegeryesterdayDay=[yesterdayComponents day];// 前天(以“现在”的时候为基准-2天)NSDate*beforeYesterdayDate = [NSDatedate];beforeYesterdayDate = [NSDatedateWithTimeInterval:-48*60*60 sinceDate:beforeYesterdayDate];NSDateComponents*beforeYesterdayComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDayfromDate:beforeYesterdayDate];NSIntegersrcMonth=[srcComponents month];NSIntegersrcYear=[srcComponents year];NSIntegersrcDay=[srcComponents day];}// 当年 && 当天之外的时间(即昨天及以前的时间)else{// 昨天(以“现在”的时候为基准-1天)NSDate*yesterdayDate = [NSDatedate];yesterdayDate = [NSDatedateWithTimeInterval:-24*60*60 sinceDate:yesterdayDate];// 要分外显示的时间分钟String timeExtraStr = (mustIncludeTime?" "+getTimeString(srcDate, "HH:mm"):"");// 当年if(currentYear == srcYear){longcurrentTimestamp = gcCurrent.getTimeInMillis();longsrcTimestamp = gcSrc.getTimeInMillis();GregorianCalendar gcSrc = newGregorianCalendar();gcSrc.setTime(srcDate);intsrcYear = gcSrc.get(GregorianCalendar.YEAR);gcCurrent.setTime(newDate());intcurrentYear = gcCurrent.get(GregorianCalendar.YEAR);intcurrentMonth = gcCurrent.get(GregorianCalendar.MONTH)+1;intcurrentDay = gcCurrent.get(GregorianCalendar.DAY_OF_MONTH);// 用于谈天信息界面时getTimeStringAutoShort2(newDate(), true);}5.2 挪用示例// 用于首页“消息”界面时getTimeStringAutoShort2(newDate(), false);* @param dt 日期时间工具(本次被判断工具)* @param includeTime YES表现输出的花样里一定会包罗“时间:分钟”,否则不包罗(参考微信,不包罗时分的情况,用于首页“消息”中显示时)* @return 输特别式形如:“刚刚”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式* @since 1.3*/+ (NSString*)getTimeStringAutoShort2:(NSDate*)dt mustIncludeTime:(BOOL)includeTime;5.3 运行效果▲ 上述代码在RainbowChat Android版上的运行效果(首页)▲ 上述代码在RainbowChat Android版上的运行效果(谈天界面)6、iOS系统上的代码实现(Objective-C)6.1 完整源码源文件TimeTool.h:#import @interfaceTimeTool : NSObject/*** 模仿微信中的消息时间显示逻辑,将时间戳(单元:毫秒)转换为友好的显示花样.* 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?+ (NSString*)getTimeString:(NSDate*)dt format:(NSString*)fmt;// 当天(月份和日期一致才是)if(currentMonth == srcMonth && currentDay == srcDay){// 时间相差60秒以内if(delta < 60* 1000)ret = "刚刚";// 相差时间(单元:毫秒)longdelta = (currentTimestamp - srcTimestamp);// 当前时间NSDate*currentDate = [NSDatedate];NSDateComponents*curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekdayfromDate:currentDate];NSIntegercurrentYear=[curComponents year];}// 当年 && 当天之外的时间(即昨天及以前的时间)else{// 昨天(以“现在”的时候为基准-1天)GregorianCalendar yesterdayDate = newGregorianCalendar();// 否则当天其它时间段的,直接显示“时:分”的形式elseret = getTimeString(srcDate, "HH:mm");}}/*** 模仿微信中的消息时间显示逻辑,将时间戳(单元:毫秒)转换为友好的显示花样.* * 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?(只显示总计7天之内的星期数,即7天)的逻辑:直接显示完整日期时间。
** @param srcDate 要处置惩罚的源日期时间工具* @param mustIncludeTime true表现输出的花样里一定会包罗“时间:分钟”,否则不包罗(参考微信,不包罗时分的情况,用于首页“消息”中显示时)* @return 输特别式形如:“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式* @author 即时通讯网([url=http://www.52im.net]http://www.52im.net[/url])* @since 4.5*/publicstaticString getTimeStringAutoShort2(Date srcDate, booleanmustIncludeTime){String ret = "";try{GregorianCalendar gcCurrent = newGregorianCalendar();NSIntegercurrentMonth=[curComponents month];NSIntegercurrentDay=[curComponents day];// 目的判断时间NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekdayfromDate:dt];intsrcMonth = gcSrc.get(GregorianCalendar.MONTH)+1;intsrcDay = gcSrc.get(GregorianCalendar.DAY_OF_MONTH);/*** 获得指定NSDate工具iOS时间戳(花样遵从ios的习惯,以秒为单元)。*/+ (NSTimeInterval) getIOSTimeStamp:(NSDate*)dat;/*** 获得指定NSDate工具iOS时间戳的long形式(花样遵从ios的习惯,以秒为单元,形如:1485159493)。
}returnret;}catch(Exception e){System.err.println("【DEBUG-getTimeStringAutoShort】盘算堕落:"+e.getMessage()+" 【NO】");ret = weedayDesc+timeExtraStr;}// 否则直接显示完整日期时间elseret = getTimeString(srcDate, "yyyy/M/d")+timeExtraStr;}}}elseret = getTimeString(srcDate, "yyyy/M/d")+timeExtraStr;NSIntegeryesterdayMonth=[yesterdayComponents month];NSDateComponents*yesterdayComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDayfromDate:yesterdayDate];2)当谈天消息的时间大于一周时:直接显示“年/月/日 时:分”的完整时间花样。注意:谈天内容界面里的时间花样,实际上是首页“消息”界面里的时间花样加上“时:分”后的效果,所以代码实现上这两套代码是可重用的,无需两份代码。本文为原创分享,转载请注明出处。1、引言即时通讯IM应用中的谈天消息时间显示是个再常见不外的需求,现在都讲求用户体验,所以时间显示再也不能像传统软件一样简朴粗地暴显示成“年/月/日 时:分:秒”这样。
// 当天(月份和日期一致才是)if(currentMonth == srcMonth && currentDay == srcDay) {// 时间相差60秒以内if(delta < 60)ret = @"刚刚";// 相差时间(单元:秒)longdelta = currentTimestamp - srcTimestamp;// 否则当天其它时间段的,直接显示“时:分”的形式elseret = [TimeTool getTimeString:dt format:@"HH:mm"];// 当年if(currentYear == srcYear) {longcurrentTimestamp = [TimeTool getIOSTimeStamp_l:currentDate];longsrcTimestamp = [TimeTool getIOSTimeStamp_l:dt];② 微信对于谈天消息时间显示的规则总结如下(谈天内容界面):1)当谈天消息时间为一周之内时:当天的消息显示为“小时:分钟”形式,然后是“昨天 时:分”、“前天 时:分”,然后就是“星期几 时:分”这个样子;2)当谈天消息的时间大于一周时:直接显示“年/月/日”的时间花样。整体来看,仿微信的IM谈天时间显示花样(含iOS/Android/Web实现)[图文+源码]‘星空官方,星空赛事,星空百家乐,星空平台’的相关信息仍值得持续留意。
本文关键词:星空官方,星空赛事,星空百家乐,星空平台
本文来源:星空官方,星空赛事,星空百家乐,星空平台-www.xingkongsportshub.com
- 手机:
- 16253449017
- 邮箱:
- admin@xingkongsportshub.com
- 电话:
- 0628-49283195
- 地址:
- 湖南省怀化市德庆县同标大楼73号
