已经有Basil Bourque提供了很好的答案。根据你的评论,我认为我可以再具体一点:
public static String diff(String thenStr) {
Instant now = Instant.now();
Instant then = Instant.parse(thenStr);
ChronoUnit[] units = ChronoUnit.values();
for (int i = units.length - 1; i >= 0; i--) {
if (then.isSupported(units[i])) {
long diffInCurrentUnit = units[i].between(then, now);
if (diffInCurrentUnit != 0) {
return "" + diffInCurrentUnit + ' ' + units[i].toString().toLowerCase();
}
}
}
return "0";
}
让我们试试:
System.out.println(diff("2019-02-23T16:50:21Z"));
System.out.println(diff("2019-02-23T20:15:21Z"));
刚刚运行时的输出:
3 hours
36 seconds
我使用的导入:
import org.threeten.bp.Instant;
import org.threeten.bp.temporal.ChronoUnit;
import org.threeten.bp.temporal.UnsupportedTemporalTypeException;
Instant
不支持比天更长的时间单位,如果需要返回周、月或年,只需使用OffsetDateTime
代替Instant
即可。
问题:我可以在我的Android API级别上使用java.time吗?
是的,在旧版和新版Android设备上,java.time都可以正常使用。只需至少具有Java 6。
- 在Java 8及更高版本和更新的Android设备(从API级别26开始),现代API已内置。此时,请从
java.time
及其子包中导入。
- 在Java 6和7中,获取ThreeTen Backport,即现代类的后备(ThreeTen用于JSR 310;请参见底部的链接)。
- 在(旧版)Android上使用ThreeTen Backport的Android版。它被称为ThreeTenABP。并确保您从
org.threeten.bp
及其子包中导入日期和时间类。
一个流?
编辑:@Basil Bourque在评论中问道:
我想知道这个是否可以压缩成一个流,也许是一行代码?
可以,但我认为在这种情况下并没有优势:
return IntStream.range(0, units.length)
.map(i -> units.length - i - 1)
.mapToObj(i -> units[i])
.filter(then::isSupported)
.filter(unit -> unit.between(then, now) != 0)
.map(unit -> "" + unit.between(then, now) + ' ' + unit.toString().toLowerCase())
.findFirst()
.orElse("0");
我发现将数组元素倒序排列的代码 .map(i -> units.length - i - 1)
难以理解。我们需要两次计算差值,一次是用于筛选,另一次是用于组合字符串结果。但它能够正常工作,如果您喜欢可以使用。
通过一个内部流水线可以避免双重计算,尽管这样做更难以理解:
.flatMap(unit -> LongStream.of(unit.between(then, now))
.filter(diff -> diff != 0)
.mapToObj(diff -> "" + diff + ' ' + unit.toString().toLowerCase()))
链接