我建议看一下乔达时间 http://www.joda.org/joda-time/,注意到:
Joda-Time 是 Java SE 8 之前的 Java 事实上的标准日期和时间库。现在要求用户迁移到 java.time (JSR-310)。
安装
- 对于基于 Debian 的系统:
libjoda-time-java
。罐子将在/usr/share/java
as joda-time.jar
- 为他人:Download https://sourceforge.net/projects/joda-time/files/joda-time/最新的罐子,例如joda-time-2.2-dist.zip 其中包括 joda-time-2.2.jar
使用 Eclipse 时,将其添加到 Java 构建路径(项目 > 属性 > Java 构建路径 > 添加外部 Jar)
相关Java文档
- DateTime http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html
- Period http://joda-time.sourceforge.net/apidocs/org/joda/time/Period.html
- 周期格式化程序 http://joda-time.sourceforge.net/apidocs/org/joda/time/format/PeriodFormatter.html
- 周期格式化程序生成器 http://joda-time.sourceforge.net/apidocs/org/joda/time/format/PeriodFormatterBuilder.html
示例代码
import java.sql.Timestamp;
import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
public class MinimalWorkingExample {
static Date date = new Date(1990, 4, 28, 12, 59);
public static String getTimestampDiff(Timestamp t) {
final DateTime start = new DateTime(date.getTime());
final DateTime end = new DateTime(t);
Period p = new Period(start, end);
PeriodFormatter formatter = new PeriodFormatterBuilder()
.printZeroAlways().minimumPrintedDigits(2).appendYears()
.appendSuffix(" year", " years").appendSeparator(", ")
.appendMonths().appendSuffix(" month", " months")
.appendSeparator(", ").appendDays()
.appendSuffix(" day", " days").appendSeparator(" and ")
.appendHours().appendLiteral(":").appendMinutes()
.appendLiteral(":").appendSeconds().toFormatter();
return p.toString(formatter);
}
public static void main(String[] args) {
String diff = getTimestampDiff(new Timestamp(2013, 3, 20, 7, 51, 0, 0));
System.out.println(diff);
}
}
Output:
22 years, 10 months, 01 day and 18:52:00
为什么我推荐新的解决方案
- 它更短(726 个字符/14 行,而您的 1665 个字符/41 行)
- 更容易理解
- 调整起来比较容易
- 代码和表示的分离更加清晰
- 我不想修复你的代码