我需要计算从一个特定日期到现在的时间,并以与StackOverflow问题相同的格式显示它,即:
15s ago
2min ago
2hours ago
2days ago
25th Dec 08
您知道如何使用Java Joda-Time库实现它吗?有没有已经实现它的辅助方法,还是我应该自己编写算法?
我需要计算从一个特定日期到现在的时间,并以与StackOverflow问题相同的格式显示它,即:
15s ago
2min ago
2hours ago
2days ago
25th Dec 08
您知道如何使用Java Joda-Time库实现它吗?有没有已经实现它的辅助方法,还是我应该自己编写算法?
java.util.Date
仅适用于旧类。但是,我的lib Time4J库是IMHO最好的库,它可以打印相对时间(ago格式)或类似“ 3个月4天”的格式的时间。它实际上也可以本地化为72种语言。
Answers:
要使用JodaTime计算经过的时间,请使用Period
。要将经过的时间格式化为所需的人类表示形式,可以使用PeriodFormatter
来构建PeriodFormatterBuilder
。
这是一个启动示例:
DateTime myBirthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0);
DateTime now = new DateTime();
Period period = new Period(myBirthDate, now);
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendSeconds().appendSuffix(" seconds ago\n")
.appendMinutes().appendSuffix(" minutes ago\n")
.appendHours().appendSuffix(" hours ago\n")
.appendDays().appendSuffix(" days ago\n")
.appendWeeks().appendSuffix(" weeks ago\n")
.appendMonths().appendSuffix(" months ago\n")
.appendYears().appendSuffix(" years ago\n")
.printZeroNever()
.toFormatter();
String elapsed = formatter.print(period);
System.out.println(elapsed);
现在打印
3秒前 51分钟前 7小时前 6天前 10个月前 31年前
(咳嗽,老咳嗽)您会发现我也考虑了几个月和几年,并将其配置为在零值时忽略这些值。
我试图HumanTime为@sfussenegger回答,并使用JodaTime的Period
,但人类可读经过的时间,我发现是最简单,最干净的方法PrettyTime库。
这是带有输入和输出的几个简单示例:
DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 );
new PrettyTime().format( fiveMinutesAgo.toDate() );
// Outputs: "5 minutes ago"
DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0);
new PrettyTime().format( birthday.toDate() );
// Outputs: "4 decades ago"
注意:我尝试过使用该库的更精确功能,但是它会产生一些奇怪的结果,因此请谨慎使用它,并在不危及生命的项目中使用。
J.P
这是使用mysql时间戳获取到现在为止的时间。单数和复数被管理。仅显示最长时间。
注意:设置您自己的时区。
String getElapsedTime(String strMysqlTimestamp) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.S");
DateTime mysqlDate = formatter.parseDateTime(strMysqlTimestamp).
withZone(DateTimeZone.forID("Asia/Kuala_Lumpur"));
DateTime now = new DateTime();
Period period = new Period(mysqlDate, now);
int seconds = period.getSeconds();
int minutes = period.getMinutes();
int hours = period.getHours();
int days = period.getDays();
int weeks = period.getWeeks();
int months = period.getMonths();
int years = period.getYears();
String elapsedTime = "";
if (years != 0)
if (years == 1)
elapsedTime = years + " year ago";
else
elapsedTime = years + " years ago";
else if (months != 0)
if (months == 1)
elapsedTime = months + " month ago";
else
elapsedTime = months + " months ago";
else if (weeks != 0)
if (weeks == 1)
elapsedTime = weeks + " week ago";
else
elapsedTime = weeks + " weeks ago";
else if (days != 0)
if (days == 1)
elapsedTime = days + " day ago";
else
elapsedTime = days + " days ago";
else if (hours != 0)
if (hours == 1)
elapsedTime = hours + " hour ago";
else
elapsedTime = hours + " hours ago";
else if (minutes != 0)
if (minutes == 1)
elapsedTime = minutes + " minute ago";
else
elapsedTime = minutes + " minutes ago";
else if (seconds != 0)
if (seconds == 1)
elapsedTime = seconds + " second ago";
else
elapsedTime = seconds + " seconds ago";
return elapsedTime;
}