date格式化输出 24小时 java_如何使用Java计算时间跨度并格式化输出?

是的,Yup唤醒了我的死人,但这是基于@mtim发布的代码的我改进的实现,因为该线程几乎位于搜索的顶部,所以我弄得昏昏欲睡,

public static String getFriendlyTime(Date dateTime) {

StringBuffer sb = new StringBuffer();

Date current = Calendar.getInstance().getTime();

long diffInSeconds = (current.getTime() - dateTime.getTime()) / 1000;

/*long diff[] = new long[]{0, 0, 0, 0};

/* sec *  diff[3] = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);

/* min *  diff[2] = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds;

/* hours *  diff[1] = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds;

/* days * diff[0] = (diffInSeconds = (diffInSeconds / 24));

*/

long sec = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);

long min = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds;

long hrs = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds;

long days = (diffInSeconds = (diffInSeconds / 24)) >= 30 ? diffInSeconds % 30 : diffInSeconds;

long months = (diffInSeconds = (diffInSeconds / 30)) >= 12 ? diffInSeconds % 12 : diffInSeconds;

long years = (diffInSeconds = (diffInSeconds / 12));

if (years > 0) {

if (years == 1) {

sb.append("a year");

} else {

sb.append(years + " years");

}

if (years <= 6 && months > 0) {

if (months == 1) {

sb.append(" and a month");

} else {

sb.append(" and " + months + " months");

}

}

} else if (months > 0) {

if (months == 1) {

sb.append("a month");

} else {

sb.append(months + " months");

}

if (months <= 6 && days > 0) {

if (days == 1) {

sb.append(" and a day");

} else {

sb.append(" and " + days + " days");

}

}

} else if (days > 0) {

if (days == 1) {

sb.append("a day");

} else {

sb.append(days + " days");

}

if (days <= 3 && hrs > 0) {

if (hrs == 1) {

sb.append(" and an hour");

} else {

sb.append(" and " + hrs + " hours");

}

}

} else if (hrs > 0) {

if (hrs == 1) {

sb.append("an hour");

} else {

sb.append(hrs + " hours");

}

if (min > 1) {

sb.append(" and " + min + " minutes");

}

} else if (min > 0) {

if (min == 1) {

sb.append("a minute");

} else {

sb.append(min + " minutes");

}

if (sec > 1) {

sb.append(" and " + sec + " seconds");

}

} else {

if (sec <= 1) {

sb.append("about a second");

} else {

sb.append("about " + sec + " seconds");

}

}

sb.append(" ago");

/*String result = new String(String.format(

"%d day%s, %d hour%s, %d minute%s, %d second%s ago",

diff[0],

diff[0] > 1 ? "s" : "",

diff[1],

diff[1] > 1 ? "s" : "",

diff[2],

diff[2] > 1 ? "s" : "",

diff[3],

diff[3] > 1 ? "s" : ""));*/

return sb.toString();

}

显然可以改进。基本上,它试图使时间跨度更友好,但是有一些限制,即,如果经过的时间(参数)是将来的话,它的行为会很奇怪,并且仅限于天,小时和秒(不包括月和年)处理,以便其他人可以;-)。

示例输出为:

大约一秒钟前

8分34秒前

一个小时四分钟前

一天前

29天前

一年零三个月前

,欢呼声:D

编辑:现在支持月份和年份:P

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值