/**
* 返回指定pattern样的日期时间字符串。
*
* @param dt
* @param pattern
* @return 如果时间转换成功则返回结果,否则返回空字符串""
* @author 即时通讯网([url=http://]http://[/url])
*/
publicstaticString getTimeString(Date dt, String pattern)
{
try
{
SimpleDateFormat sdf = newSimpleDateFormat(pattern);//"yyyy-MM-dd HH:mm:ss"
(());
(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://]http://[/url])
* @since 4.5
*/
publicstaticString getTimeStringAutoShort2(Date srcDate, booleanmustIncludeTime)
{
String ret = "";
try
{
GregorianCalendar gcCurrent = newGregorianCalendar();
(newDate());
intcurrentYear = ();
intcurrentMonth = ()+1;
intcurrentDay = (GregorianCalendar.DAY_OF_MONTH);
GregorianCalendar gcSrc = newGregorianCalendar();
(srcDate);
intsrcYear = ();
intsrcMonth = ()+1;
intsrcDay = (GregorianCalendar.DAY_OF_MONTH);
// 要额外显示的时间分钟
String timeExtraStr = (mustIncludeTime?" "+getTimeString(srcDate, "HH:mm"):"");
// 当年
if(currentYear == srcYear)
{
longcurrentTimestamp = ();
longsrcTimestamp = ();
// 相差时间(单位:毫秒)
longdelta = (currentTimestamp - srcTimestamp);
// 当天(月份和日期一致才是)
if(currentMonth == srcMonth && currentDay == srcDay)
{
// 时间相差60秒以内
if(delta < 60* 1000)
ret = "刚刚";
// 否则当天其它时间段的,直接显示“时:分”的形式
else
ret = getTimeString(srcDate, "HH:mm");
}
// 当年 && 当天之外的时间(即昨天及以前的时间)
else
{
// 昨天(以“现在”的时候为基准-1天)
GregorianCalendar yesterdayDate = newGregorianCalendar();
(GregorianCalendar.DAY_OF_MONTH, -1);
// 前天(以“现在”的时候为基准-2天)
GregorianCalendar beforeYesterdayDate = newGregorianCalendar();
(GregorianCalendar.DAY_OF_MONTH, -2);
// 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较,是最为准确的(如果用时间戳差值
// 的形式,是不准确的,比如:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,
// 这两者间只相差2小时,直接用“delta/(3600 * 1000)” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了)
if(srcMonth == (()+1)
&& srcDay == (GregorianCalendar.DAY_OF_MONTH))
{
ret = "昨天"+timeExtraStr;// -1d
}
// “前天”判断逻辑同上
elseif(srcMonth == (()+1)
&& srcDay == (GregorianCalendar.DAY_OF_MONTH))
{
ret = "前天"+timeExtraStr;// -2d
}
else
{
// 跟当前时间相差的小时数
longdeltaHour = (delta/(3600* 1000));
// 如果小于 7*24小时就显示星期几
if(deltaHour < 7*24)
{
String[] weekday = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
// 取出当前是星期几
String weedayDesc = weekday[(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)
{
("【DEBUG-getTimeStringAutoShort】计算出错:"+()+" 【NO】");
}
returnret;
}