【问题标题】:Java How to get the percentage between 2 datetimesJava如何获得2个日期时间之间的百分比
【发布时间】:2020-05-30 11:42:13
【问题描述】:

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

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

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);

}

【问题讨论】:

  • 百分比?你能解释一下这两个日期时间的含义吗?
  • 也许将您的 LocalDateTime 对象转换为纪元然后使用它们进行计算会更简单。检查方法toEpochSecond(ZoneOffset zos)。顺便说一句,为了从中计算百分比,我猜你应该除以一些东西?
  • 将它们转换为整数(无论你喜欢什么方式)。 progress=(current-start)/(end-start)*100

标签: java android time elapsedtime localdatetime


【解决方案1】:

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

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));

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

【讨论】:

  • 漂亮!尤其是Java 9 and later这部分是我今天学到的。
猜你喜欢
  • 2019-08-26
  • 2011-06-08
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多