繁体   English   中英

时间戳 1 是时间戳 2 的第二天

[英]Timestamp1 is next day of timestamp2

我有两个时间戳,我想检查第一个时间戳是否是第二个时间戳的第二天(明天)。

** 第二天不是 24 小时,只是下 DAY_OF_MONTH。 例如:明天凌晨 1 点的时间戳是今天晚上 10 点的第二天(尽管只有 3 小时) - 因此 ts1 - ts2 < 86400 在这里没有帮助。

首先我想提取mounth的那一天并比较delta,但这不好,因为第二天可能是新的月份(或新年..)

我能想到的唯一解决方案是:

Calendar cal1 = Calendar.getInstance();
cal1.setTimeInMillis(1582783200000L);

Calendar cal2 = Calendar.getInstance();
cal2.setTimeInMillis(1582727735000L);

cal2.add(Calendar.DAY_OF_YEAR, 1);
cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH);

但它对我来说看起来很丑陋的代码......你知道另一种方法吗?

可以使用新的日期时间 api 稍微简化它

        ZoneId zone = ZoneId.systemDefault();
        boolean nextDay = 1 == ChronoUnit.DAYS.between(
                Instant.ofEpochMilli(1582727735000L).atZone(zone).truncatedTo(ChronoUnit.DAYS),
                Instant.ofEpochMilli(1582783200000L).atZone(zone).truncatedTo(ChronoUnit.DAYS));


请注意,结果取决于时区。 因此,该示例指的是系统默认值,对于生产代码,应应用显式时区。

请使用 java.time,现代 Java 日期和时间 API,就像另一个答案一样。 我的版本是:

    ZoneId zone = ZoneId.of("Asia/Tel_Aviv");
    LocalDate d1 = Instant.ofEpochMilli(1_582_783_200_000L).atZone(zone).toLocalDate();
    LocalDate d2 = Instant.ofEpochMilli(1_582_727_735_000L).atZone(zone).toLocalDate();
    if (d2.plusDays(1).equals(d1)) {
        System.out.println("" + d1 + " is the day after " + d2);
    } else {
        System.out.println("" + d1 + " is *not* the day after " + d2);
    }

输出是:

2020-02-27是2020-02-26的次日

正如 edwgiz 已经说过的,结果取决于时区,因此请确保指定所需的时区。 我更喜欢用下划线作为千位分隔符来写这么多数字以提高可读性。 LocalDate是公历中没有时间的日期,因此比较两个这样的对象可以确保我们在比较中忽略时间。

PS 比较问题中的月份日期在极端情况下是不够的。 将今年 2 月 27 日与去年 11 月 27 日进行比较时,结果为真。 如果我们想使用Calendar ,我们就需要比较时代、年、月和月中的哪一天。 换句话说,它并没有像 java.time 那样为我们的工作提供良好的支持。

教程链接: Oracle 教程:解释如何使用 java.time 的日期时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM