本文为即时通讯网原创分享,转载请注明出处。
0-2.jpg (30.64 KB, 下载次数: 1567)
下载附件 保存到相册
5 年前 上传
0-1.jpg (32.46 KB, 下载次数: 1503)
屏幕快照-2019-02-22-12.24.jpg (22.89 KB, 下载次数: 1510)
/** * 返回指定pattern样的日期时间字符串。 * * @param dt * @param pattern * @return 如果时间转换成功则返回结果,否则返回空字符串"" * @author 即时通讯网([url=http://www.52im.net]http://www.52im.net[/url]) */ public static String getTimeString(Date dt, String pattern) { try { SimpleDateFormat sdf = new SimpleDateFormat(pattern);//"yyyy-MM-dd HH:mm:ss" sdf.setTimeZone(TimeZone.getDefault()); return sdf.format(dt); } catch (Exception e) { return ""; } } /** * 仿照微信中的消息时间显示逻辑,将时间戳(单位:毫秒)转换为友好的显示格式. * <p> * 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?(只显示总计7天之内的星期数,即<=-4d);<br> * 2)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 */ public static String getTimeStringAutoShort2(Date srcDate, boolean mustIncludeTime) { String ret = ""; try { GregorianCalendar gcCurrent = new GregorianCalendar(); gcCurrent.setTime(new Date()); int currentYear = gcCurrent.get(GregorianCalendar.YEAR); int currentMonth = gcCurrent.get(GregorianCalendar.MONTH)+1; int currentDay = gcCurrent.get(GregorianCalendar.DAY_OF_MONTH); GregorianCalendar gcSrc = new GregorianCalendar(); gcSrc.setTime(srcDate); int srcYear = gcSrc.get(GregorianCalendar.YEAR); int srcMonth = gcSrc.get(GregorianCalendar.MONTH)+1; int srcDay = gcSrc.get(GregorianCalendar.DAY_OF_MONTH); // 要额外显示的时间分钟 String timeExtraStr = (mustIncludeTime?" "+getTimeString(srcDate, "HH:mm"):""); // 当年 if(currentYear == srcYear) { long currentTimestamp = gcCurrent.getTimeInMillis(); long srcTimestamp = gcSrc.getTimeInMillis(); // 相差时间(单位:毫秒) long delta = (currentTimestamp - srcTimestamp); // 当天(月份和日期一致才是) if(currentMonth == srcMonth && currentDay == srcDay) { // 时间相差60秒以内 if(delta < 60 * 1000) ret = "刚刚"; // 否则当天其它时间段的,直接显示“时:分”的形式 else ret = getTimeString(srcDate, "HH:mm"); } // 当年 && 当天之外的时间(即昨天及以前的时间) else { // 昨天(以“现在”的时候为基准-1天) GregorianCalendar yesterdayDate = new GregorianCalendar(); yesterdayDate.add(GregorianCalendar.DAY_OF_MONTH, -1); // 前天(以“现在”的时候为基准-2天) GregorianCalendar beforeYesterdayDate = new GregorianCalendar(); 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;// -1d } // “前天”判断逻辑同上 else if(srcMonth == (beforeYesterdayDate.get(GregorianCalendar.MONTH)+1) && srcDay == beforeYesterdayDate.get(GregorianCalendar.DAY_OF_MONTH)) { ret = "前天"+timeExtraStr;// -2d } else { // 跟当前时间相差的小时数 long deltaHour = (delta/(3600 * 1000)); // 如果小于 7*24小时就显示星期几 if (deltaHour < 7*24) { String[] weekday = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; // 取出当前是星期几 String weedayDesc = weekday[gcSrc.get(GregorianCalendar.DAY_OF_WEEK)-1]; ret = weedayDesc+timeExtraStr; } // 否则直接显示完整日期时间 else ret = getTimeString(srcDate, "yyyy/M/d")+timeExtraStr; } } } else ret = getTimeString(srcDate, "yyyy/M/d")+timeExtraStr; } catch (Exception e) { System.err.println("【DEBUG-getTimeStringAutoShort】计算出错:"+e.getMessage()+" 【NO】"); } return ret; }
// 用于首页“消息”界面时 getTimeStringAutoShort2(new Date(), false); // 用于聊天内容界面时 getTimeStringAutoShort2(new Date(), true);
3.jpg (40.6 KB, 下载次数: 1563)
4.jpg (44 KB, 下载次数: 1509)
// // TimeTool.h // RainbowChat4i // // Created by JackJiang on 2018/5/8. // Copyright © 2018年 即时通讯网([url=http://www.52im.net]http://www.52im.net[/url]). All rights reserved. // #import <Foundation/Foundation.h> @interface TimeTool : NSObject /** * 仿照微信中的消息时间显示逻辑,将时间戳(单位:毫秒)转换为友好的显示格式. * * 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?(只显示总计7天之内的星期数,即<=-4d); * 2)7天之外(即>7天)的逻辑:直接显示完整日期时间。 * * @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; + (NSString *)getTimeString:(NSDate *)dt format:(NSString *)fmt; /** * 获得指定NSDate对象iOS时间戳(格式遵从ios的习惯,以秒为单位)。 */ + (NSTimeInterval) getIOSTimeStamp:(NSDate *)dat; /** * 获得指定NSDate对象iOS时间戳的long形式(格式遵从ios的习惯,以秒为单位,形如:1485159493)。 */ + (long) getIOSTimeStamp_l:(NSDate *)dat; /** * 获得iOS当前系统时间的NSDate对象。 */ + (NSDate*)getIOSDefaultDate; @end
// // TimeTool.m // RainbowChat4i // // Created by JackJiang on 2018/5/8. // Copyright © 2018年 即时通讯网([url=http://www.52im.net]http://www.52im.net[/url]). All rights reserved. // #import "TimeTool.h" @implementation TimeTool // 仿照微信的逻辑,显示一个人性化的时间字串 + (NSString *)getTimeStringAutoShort2:(NSDate *)dt mustIncludeTime:(BOOL)includeTime{ NSString *ret = nil; NSCalendar *calendar = [NSCalendar currentCalendar]; // 当前时间 NSDate *currentDate = [NSDate date]; NSDateComponents *curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:currentDate]; NSInteger currentYear=[curComponents year]; NSInteger currentMonth=[curComponents month]; NSInteger currentDay=[curComponents day]; // 目标判断时间 NSDateComponents *srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:dt]; NSInteger srcYear=[srcComponents year]; NSInteger srcMonth=[srcComponents month]; NSInteger srcDay=[srcComponents day]; // 要额外显示的时间分钟 NSString *timeExtraStr = (includeTime?[TimeTool getTimeString:dt format:@" HH:mm"]:@""); // 当年 if(currentYear == srcYear) { long currentTimestamp = [TimeTool getIOSTimeStamp_l:currentDate]; long srcTimestamp = [TimeTool getIOSTimeStamp_l:dt]; // 相差时间(单位:秒) long delta = currentTimestamp - srcTimestamp; // 当天(月份和日期一致才是) if(currentMonth == srcMonth && currentDay == srcDay) { // 时间相差60秒以内 if(delta < 60) ret = @"刚刚"; // 否则当天其它时间段的,直接显示“时:分”的形式 else ret = [TimeTool getTimeString:dt format:@"HH:mm"]; } // 当年 && 当天之外的时间(即昨天及以前的时间) else { // 昨天(以“现在”的时候为基准-1天) NSDate *yesterdayDate = [NSDate date]; yesterdayDate = [NSDate dateWithTimeInterval:-24*60*60 sinceDate:yesterdayDate]; NSDateComponents *yesterdayComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:yesterdayDate]; NSInteger yesterdayMonth=[yesterdayComponents month]; NSInteger yesterdayDay=[yesterdayComponents day]; // 前天(以“现在”的时候为基准-2天) NSDate *beforeYesterdayDate = [NSDate date]; beforeYesterdayDate = [NSDate dateWithTimeInterval:-48*60*60 sinceDate:beforeYesterdayDate]; NSDateComponents *beforeYesterdayComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:beforeYesterdayDate]; NSInteger beforeYesterdayMonth=[beforeYesterdayComponents month]; NSInteger beforeYesterdayDay=[beforeYesterdayComponents day]; // 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较,是最为准确的(如果用时间戳差值 // 的形式,是不准确的,比如:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00, // 这两者间只相差2小时,直接用“delta/3600” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了) if(srcMonth == yesterdayMonth && srcDay == yesterdayDay) ret = [NSString stringWithFormat:@"昨天%@", timeExtraStr];// -1d // “前天”判断逻辑同上 else if(srcMonth == beforeYesterdayMonth && srcDay == beforeYesterdayDay) ret = [NSString stringWithFormat:@"前天%@", timeExtraStr];// -2d else{ // 跟当前时间相差的小时数 long deltaHour = (delta/3600); // 如果小于或等 7*24小时就显示星期几 if (deltaHour <= 7*24){ NSArray<NSString *> *weekdayAry = [NSArray arrayWithObjects:@"星期日", @"星期一", @"星期二", @"星期三", @"星期四", @"星期五", @"星期六", nil]; // 取出的星期数:1表示星期天,2表示星期一,3表示星期二。。。。 6表示星期五,7表示星期六 NSInteger srcWeekday=[srcComponents weekday]; // 取出当前是星期几 NSString *weedayDesc = [weekdayAry objectAtIndex:(srcWeekday-1)]; ret = [NSString stringWithFormat:@"%@%@", weedayDesc, timeExtraStr]; } // 否则直接显示完整日期时间 else ret = [NSString stringWithFormat:@"%@%@", [TimeTool getTimeString:dt format:@"yyyy/M/d"], timeExtraStr]; } } } // 往年 else{ ret = [NSString stringWithFormat:@"%@%@", [TimeTool getTimeString:dt format:@"yyyy/M/d"], timeExtraStr]; } return ret; } + (NSString *)getTimeString:(NSDate *)dt format:(NSString *)fmt{ NSDateFormatter* format = [[NSDateFormatter alloc] init]; [format setDateFormat:fmt]; return [format stringFromDate:(dt==nil?[TimeTool getIOSDefaultDate]:dt)]; } + (NSTimeInterval) getIOSTimeStamp:(NSDate *)dat{ NSTimeInterval a = [dat timeIntervalSince1970]; return a; } + (long) getIOSTimeStamp_l:(NSDate *)dat{ return [[NSNumber numberWithDouble:[TimeTool getIOSTimeStamp:dat]] longValue]; } + (NSDate*)getIOSDefaultDate { return [NSDate date]; } @end
// 用于首页“消息”界面时 [TimeTool getTimeStringAutoShort2:[NSDate date] mustIncludeTime:NO];
WX20190223-102809@2x.jpg (42.62 KB, 下载次数: 1531)
/** * 对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 * * @author 即时通讯网([url=http://www.52im.net]http://www.52im.net[/url]) */ 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 */ var _getTimeStringAutoShort2 = function(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 = "刚刚"; // 否则当天其它时间段的,直接显示“时:分”的形式 else ret = _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;// -2d else{ // 跟当前时间相差的小时数 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; } // 否则直接显示完整日期时间 else ret = _formatDate(srcDate, "yyyy/M/d")+timeExtraStr; } } } // 往年 else{ ret = _formatDate(srcDate, "yyyy/M/d")+timeExtraStr; } return ret; };
// 用于首页“消息”界面时 _getTimeStringAutoShort2(1550789954260, false); // 用于聊天内容界面时 _getTimeStringAutoShort2(1550789954260, true);
1.jpg (52.38 KB, 下载次数: 1529)
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
本人属:鸡
本人属:龙
本人属:鼠
本人属:牛
本人属:虎
本人属:兔
本人属:蛇
本人属:马
本人属:羊
本人属:猴
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.140630 second(s), 39 queries , Gzip On.