Java中是否有类似TimeSpan的类用于排序?

59

我想知道java.util中是否需要TimeSpan,以便我可以定义两个时间之间相隔多少小时、分钟和秒。

通过这个TimeSpan,我们可以得到两个时间之间的时间间隔,例如:

TimeSpan getTimeSpan( Date before, Date after ){...}
或者
long timeSpan = System.currentTimeMillis();
// ... long job
timeSpan = System.currentTimeMillis() - timeSpan;

TimeSpan ts = new TimeSpan(timeSpan);

有了这个 TimeSpan,我们可以在 SimpleDateFormat 中使用它。

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
format.format( timsSpan );

我不确定这个功能在Java中是否已经被实现了,但可能是我还未发现。

4个回答

38

JDK 8日期时间库已经得到丰富,您可以使用DurationPeriod

如果需要,可以使用JodaTime中的Interval

时间间隔表示两个瞬间之间的一段时间。间隔包括开始瞬间,但不包括结束瞬间。结束瞬间始终大于或等于开始瞬间。

间隔具有固定的毫秒持续时间。这是开始和结束瞬间之间的差异。持续时间由ReadableDuration单独表示。因此,间隔不能比较。要比较两个间隔的长度,应该比较它们的持续时间。

间隔也可以转换为ReadablePeriod。这表示以年、日等字段为单位的开始和结束点之间的差异。

Interval是线程安全和不可变的。


11
我喜欢JodaTime的Interval。但我想知道为什么标准库还没有提供这样的实用工具,因为使用非常普遍。 - Talha Ahmed Khan
1
也许Joda Time很快就会被添加到标准库中。 - jmj
4
这确实发生了,请查看我的回答以及此处回答此问题的文档:https://docs.oracle.com/javase/8/docs/api/java/time/Period.html - Anton Kaiser
很高兴看到这件事发生了,我在2011年就已经预见到了 :) - jmj

30

在Java 8中,标准API新增了一个适当的时间库(这是基于JodaTime的)。

其中有两个类可用于表示时间段:

  1. Duration 表示一个时间跨度的秒数或纳秒数长度。
  2. Period 更加用户友好的差异,以“x年y月”等形式存储。

关于它们之间的区别的详细解释可以在Java教程中找到。


4
如果您使用的是Java 8(或更高版本),或者不想导入JodaTime(JodaTime的作者建议迁移到java.time),则Java 8提供了该功能,使用Periods,请参见此处的教程:https://docs.oracle.com/javase/tutorial/datetime/iso/period.html
让我引用Oracle的教程:
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1);

Period p = Period.between(birthday, today);
long p2 = ChronoUnit.DAYS.between(birthday, today);
System.out.println("You are " + p.getYears() + " years, " + p.getMonths() +
                   " months, and " + p.getDays() +
                   " days old. (" + p2 + " days total)");

该代码生成类似于以下内容的输出:
You are 53 years, 4 months, and 29 days old. (19508 days total)

0

如果你正在寻找一种替代版本,可以看看这个我为自己的Android应用程序编写的库。https://github.com/ashokgelal/samaya

抱歉,我没有关于它的使用文档,但它与对应的.net Timespan类非常相似。此外,还有一些单元测试包含了许多关于如何使用它的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接