0

我想获得两个日期时间之间的百分比,以便我可以使用进度条。

我有以下代码,我传入两个日期时间并进行求和,但出现错误。

private void getpercentage(String dateTimeStart, String dateTimeExpiration) {

    LocalDateTime start = LocalDateTime.parse(dateTimeStart.replace( " " , "T" ) );
    LocalDateTime end = LocalDateTime.parse(dateTimeExpiration.replace( " " , "T" ) );
    String start_date = start.toString().replace( "T", " " );
    String end_date = end.toString().replace( "T", " " );
    String p = Math.round( (end_date - start_date) * 100) + '%';
    Log.d("type", "Date parsed : " + p);

}
4

1 回答 1

2

如果不考虑时区,您将无法正确执行此操作。

private void getpercentage(String dateTimeStart, String dateTimeExpiration) {
    ZoneId zone = ZoneId.systemDefault();

    ZonedDateTime start = LocalDateTime.parse(dateTimeStart.replace( " " , "T" ) )
            .atZone(zone);
    ZonedDateTime end = LocalDateTime.parse(dateTimeExpiration.replace( " " , "T" ) )
            .atZone(zone);

    long total = ChronoUnit.MICROS.between(start, end);
    long passed = ChronoUnit.MICROS.between(start, ZonedDateTime.now(zone));

    long percentage = passed * 100 / total;

    System.out.println(String.valueOf(percentage) + " %");
}

要查看一天过去了多少时间:

    getpercentage("2020-05-30 00:00:00", "2020-05-31 00:00:00");

现在在我的时区欧洲/哥本哈根运行时:

91 %

为了说明我关于时区的观点:改为在印度/马尔代夫时区运行时:

103 %

所以在那个时区,5 月 30 日已经结束,到 5 月 31 日我们还有 3%。

使用long类型和ChronoUnit.MICROS(微秒)将适用于长达 290 000 年的时间跨度。对于更长的跨度,选择更粗的单位。要获得更高的精度和更短的跨度,请使用更精细的单位,即纳秒。

Java 9 及更高版本

long percentage = Duration.between(start, ZonedDateTime.now(zone))
        .multipliedBy(100)
        .dividedBy(Duration.between(start, end));

Java 9 中引入了重载Duration.dividedBy(Duration)方法。这允许我们使用Duration类进行计算,因此我们不需要决定特定的时间单位。

于 2020-05-30T12:52:54.490 回答