【问题标题】:Subtract 2 timestamps and check their difference减去 2 个时间戳并检查它们的差异
【发布时间】:2018-04-16 07:36:40
【问题描述】:

我想找出 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 秒?

【问题讨论】:

标签: java android timestamp seconds


【解决方案1】:

你可以像这样发现不同

long diffInMs = firstTimestamp - secondTimestamp;

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

现在您已经在几秒钟内获得了差异,所以请继续检查您的状况

if(diffInSec < 120){

}

【讨论】:

  • 如何减去 2 个字符串?
  • 如果您将时间戳保存在字符串中,那么只需将字符串解析为长字符串。像 long longTimeStamp = Long.parseLong(timestampInString)
  • 请耐心等待,@AkshayPanchal。在接受答案之前等待几天以查看其他答案是否在此期间出现是很常见的。
【解决方案2】:

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

    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 类与Date 一起早已过时,而且也是出了名的麻烦。现代 API 更易于使用。

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

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

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

链接

【讨论】:

    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多