减去 2 个时间戳并检查它们的差异

Subtract 2 timestamps and check their difference

我想找出 2 个时间戳之间的差异。我正在做的是在共享首选项中存储第一个时间戳 并尝试从新的时间戳中减去它。为了获得时间戳,我使用 -

public static String setTimestamp() {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
            return dateFormat.format(new Date());
        } catch (Exception e) {
            return null;
        }
} 

如何减去 2 个时间戳并检查差异是否小于 120 秒?

你可以找到这样的区别

long diffInMs = firstTimestamp - secondTimestamp;

long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMs);

现在您的秒数有所不同,所以请继续检查您的情况

if(diffInSec < 120){

}

我建议使用以下方法获取字符串以保存到您的共享首选项中:

    String timestampToSave = Instant.now().toString();

现在计算自该字符串中给定时间以来的秒数:

    String timestampFromSharedPreferences = mySharedPrefs.getString(KEY, null);
    long diffInSeconds = Duration.between(Instant.parse(timestampFromSharedPreferences),
                                            Instant.now())
            .getSeconds();
    if (diffInSeconds < 120) {
        System.out.println("Less than 120");
    }

Instant 是独立于时区的明确时间点。它的字符串表示形式类似于 2018-04-16T09:26:27.929Z (ISO 8601)。最后的 Z 表示 UTC。因此,即使在用户更改设备的时区设置或程序的其他部分更改 JVM 的时区设置的情况下,上述内容也能正常工作。您注意到我们不需要显式格式化程序来格式化字符串并将其解析回 Instant.

如果您想比较 2 分钟而不是 120 秒,请使用 toMinutes() 而不是 getSeconds()

如果您无法更改共享首选项中保存的字符串,您需要祈祷时区设置没有更改,然后像这样解析字符串:

    DateTimeFormatter timestampFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    Instant storedTimestamp = LocalDateTime.parse(timestampFromSharedPreferences, timestampFormatter)
            .atZone(ZoneId.systemDefault())
            .toInstant();

现在让 Duration 像以前一样计算 Instant 个对象之间的差异。

我正在使用并推荐 java.time,现代 Java 日期和时间 API。您使用的 SimpleDateFormat class 与 Date 一起早已过时,并且也出了名的麻烦。现代 API 更好用。

问题:我可以在 Android 上使用 java.time 吗?

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

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接