【问题标题】:Trying to take two timestamps, subtract them, convert the difference to seconds and store in an int variable尝试取两个时间戳,减去它们,将差值转换为秒并存储在 int 变量中
【发布时间】:2020-02-26 23:20:29
【问题描述】:

我无法理解获取时间戳、减去它们以及在未来计算中分配和使用差异。我在 Android Studio 中使用 Java。

当我使用SimpleDateFormatCalendar 时,我可以在HH:mm:ss 中获得当前时间,但我不确定如何将其中两个时间戳相减并将差值转换为秒。我的最终目标是获取差异,将其转换为秒,将其分配给 int,然后将该值与其他预定值进行比较。这是 Android Studio 中的一个项目,所以我已经设置了按钮来获取时间戳。

示例:
- 获取当前时间戳,例如 16:50:32
- 在不久的将来获得第二个时间戳,比如 16:53:29(大约三分钟后)
- 减去这两个时间戳并以秒为单位存储值,因此最终值为 177(秒)
- 将这个值 177 放在一个变量中,这样我就可以用它做更多的事情。

我可以使用以下代码获取时间戳

Calendar calendar = Calendar.getInstance();
SimpleDateFormat startTime = new SimpleDateFormat("HH:mm:ss");
timeTest = startTime.format(calendar.getTime());

SimpleDateFormat endTime = new SimpleDateFormat("HH:mm:ss");
timeTest2 = endTime.format(calendar.getTime());

但是在得到两个时间戳后我不知道如何减去它们,将它们转换为秒并将它们存储在一个 int 值中。

【问题讨论】:

  • 也许您可以在开头、结尾使用System.currentTimeMillis(),然后减去它们。然后转换为秒。
  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 请查看我们的帮助中心,了解有关提高获得好答案机会的提示。它说的第一件事是:搜索、研究并跟踪您找到的内容。即使您在网站的其他地方没有找到有用的答案,包括指向相关问题的链接没有帮助其他人了解您的问题与其他问题有何不同。 (How do I ask a good question?)
  • 这能回答你的问题吗? In Java, how do I get the difference in seconds between 2 dates?请搜索更多类似的问题和答案。

标签: java android timestamp


【解决方案1】:

您使用的是 Java 8 吗?

如果是这样,您可以转换为Instants 并在它们之间获取Duration

    Calendar cal = ...
    Calendar cal2 = ...
    Instant instantOne = cal.toInstant();
    Instant instanceTwo = cal2.toInstant();
    Duration between = Duration.between(instantOne, instanceTwo);
    long seconds = between.getSeconds();

我认为您开始使用 Calendar 是有原因的(它在不受您控制的情况下传递给您?)...如果不是,那么您可以从一开始就使用 Instant.now() 并删除 pre Java 8 日期/时间类

【讨论】:

    【解决方案2】:

    tomgeraghty3 的好答案可能就是您所需要的。我正在贡献一个补充。

    java.time 和 ThreeTenABP

    如果我理解正确,您确实有两个要求:

    1. 您需要能够以HH:mm:ss 格式表示开始和结束时间。
    2. 您需要开始和结束之间经过的时间(以秒为单位)。

    不过,不要将您的时间表示为字符串。对这些进行计算是非常没有希望的。用适当的日期时间对象表示您的时间。仅在需要提供字符串输出时格式化为字符串。

        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
    
        ZonedDateTime start = ZonedDateTime.now(ZoneId.systemDefault());
        TimeUnit.SECONDS.sleep(175); // Simulate that time passes
        ZonedDateTime end = ZonedDateTime.now(ZoneId.systemDefault());
    
        long diffSeconds = ChronoUnit.SECONDS.between(start, end);
    
        System.out.printf("From %s until %s was %d seconds",
                start.format(timeFormatter), end.format(timeFormatter), diffSeconds);
    

    示例运行:

    从 05:49:41 到 05:52:36 是 175 秒

    当然要看到它运行,请先坚持使用较小的数字,例如 3 或 6,而不是 175。

    如果打印HH:mm:ss 格式不是必需的,您可以使用Instant 而不是ZonedDateTime,就像tomgeraghty3 的回答一样。由于Instant 与时区无关,因此您将省略now 方法的参数:

        Instant start = Instant.now();
    

    end 也是如此。

    根据您需要对值执行的工作,您可能需要考虑使用Duration 类来表示差异,而不是简单的秒数。 tomgeraghty3 的回答也证明了这一点。

    问题:java.time 不需要 Android API 26 级吗?

    java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

    • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
    • 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
    • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      【解决方案3】:

      这是您可以使用LocalDateTime 轻松完成的一种方法。

      LocalDateTime instance1 = LocalDateTime.now();
      //Do stuff
      LocalDateTime instance2 = LocalDateTime.now();
      long elapsedTimeInSeconds = instance1.until(instance2, ChronoUnit.SECONDS);
      System.out.println(elapsedTimeInSeconds);
      

      由于您已经有了时间戳,假设它是字符串的形式,您可以将其转换为 LocalDateTime,如下所示:

      String timestamp = "2012-08-15T22:56:02.038Z";
      LocalDateTime instance = LocalDateTime.ofInstant(Instant.parse(timestamp), ZoneId.systemDefault());
      

      编辑:将 LocalTime 更改为 LocalDateTime 以修复之前解决方案的翻转问题。

      【讨论】:

      • 虽然LocalTime 可以很好地表示一天中的某个时间,就像问题中的字符串应该表示的那样(确实要好得多),但它们对于差异计算并不是那么好。你永远不知道中间是否经过了午夜。当夏令时 (DST) 开始或结束时,它也将无法正常工作。请允许我建议 ZonedDateTime
      • @OleV.V.够公平的,伙计。
      • @OleV.V.考虑一下,LocalDateTime 应该可以正常工作而不会出现翻日问题,所以我将对其进行编辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 2019-01-17
      • 2021-09-24
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2015-07-09
      相关资源
      最近更新 更多