Java 在Android Studio中,如何计算now和RFC3339时间戳之间的差异?

Java 在Android Studio中,如何计算now和RFC3339时间戳之间的差异?,java,android-studio,datetime,rfc3339,Java,Android Studio,Datetime,Rfc3339,我正在通过带有JSON对象的服务器在我的应用程序中导入一些传感器数据。它们包含上次测量的值和时间 时间以RFC3339格式作为字符串发送,例如2020-06-19T15:32:25.528Z 现在,我不想显示上次测量的时间,而是想显示现在和测量之间的时间差 搜索时,我既没有找到将RFC3339时间戳字符串解析为可编辑格式的好方法,也没有找到计算到目前为止的差异的方法。 我只看到一篇文章,但无法在我的应用程序中导入datetime类 有人能帮忙吗 搜索时,我没有找到解析RFC3339时间戳的好方法

我正在通过带有JSON对象的服务器在我的应用程序中导入一些传感器数据。它们包含上次测量的值和时间

时间以RFC3339格式作为字符串发送,例如
2020-06-19T15:32:25.528Z

现在,我不想显示上次测量的时间,而是想显示现在和测量之间的时间差

搜索时,我既没有找到将RFC3339时间戳字符串解析为可编辑格式的好方法,也没有找到计算到目前为止的差异的方法。 我只看到一篇文章,但无法在我的应用程序中导入datetime类

有人能帮忙吗

搜索时,我没有找到解析RFC3339时间戳的好方法 字符串转换为可编辑格式,也不是计算差异的方法 现在

使用 输出:

3 hours 3 minutes 43 seconds
[更新]

请注意,Java-9引入了
Duration#toxxxxpart()
例如
Duration#toHoursPart()
。如果您使用的是Java-8,则可以使用如下所示的计算:

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Given date-time
        LocalDateTime ldt = ZonedDateTime
                .parse("2020-06-19T15:32:25.528Z",
                        DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz").withZone(ZoneId.systemDefault()))
                .toLocalDateTime();

        // Get the duration between the given date-time and now
        Duration duration = Duration.between(ldt, LocalDateTime.now(ZoneId.systemDefault()));

        // Get hours, minutes, seconds from the Duration object
        System.out.printf("%d hours %d minutes %d seconds%n", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());

        // For Java-8
        long hours = duration.toHours();
        int minutes = (int) ((duration.getSeconds() % (60 * 60)) / 60);
        int seconds = (int) (duration.getSeconds() % 60);
        System.out.printf("%d hours %d minutes %d seconds%n", hours, minutes, seconds);
    }
}
[另一个更新]礼貌


非常感谢你的想法。只有一个问题:为了实现您的建议,Android Studio告诉我没有to…Part()-方法,甚至没有toSeconds()-方法。尽管我使用了与您相同的导入,而且Oracle知道这种方法。知道为什么吗?@Anonymix-我发布了最新消息。我希望,这会有帮助。如果有任何疑问/问题,请随时发表评论。(1)
LocalDateTime
是一个错误的类,因为它忽略了源字符串中的偏移量,这对于获得正确的结果至关重要。我推荐
Instant
。(2) 您不需要指定格式化程序。
Instant.parse()
和一个arg
OffsetDateTime.parse()
将解析RFC-3339字符串,而无需任何显式格式设置程序。谢谢,@OleV.V。一如既往地感谢有价值的建议。我已将其作为更新纳入了答案中。
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Given date-time
        LocalDateTime ldt = ZonedDateTime
                .parse("2020-06-19T15:32:25.528Z",
                        DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz").withZone(ZoneId.systemDefault()))
                .toLocalDateTime();

        // Get the duration between the given date-time and now
        Duration duration = Duration.between(ldt, LocalDateTime.now(ZoneId.systemDefault()));

        // Get hours, minutes, seconds from the Duration object
        System.out.printf("%d hours %d minutes %d seconds%n", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());

        // For Java-8
        long hours = duration.toHours();
        int minutes = (int) ((duration.getSeconds() % (60 * 60)) / 60);
        int seconds = (int) (duration.getSeconds() % 60);
        System.out.printf("%d hours %d minutes %d seconds%n", hours, minutes, seconds);
    }
}
import java.time.Duration;
import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        // Given date-time
        Instant instant = Instant.parse("2020-06-19T15:32:25.528Z");

        // Get the duration between the given date-time and now
        Duration duration = Duration.between(instant, Instant.now());

        // Get hours, minutes, seconds from the Duration object
        System.out.printf("%d hours %d minutes %d seconds%n", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
    }
}