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

时间:2020-02-26 14:52:43

标签: java timestamp

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

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

首先,我认为要提取mounth的日期并比较差值,但这并不是很好,因为第二天可能是新月(或新年)。

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

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);

但是它在我看来非常丑陋的代码... 您知道另一种方法吗?

2 个答案:

答案 0 :(得分:2)

使用新的日期时间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));


请注意,结果取决于时区。因此,该示例涉及系统默认值,对于生产代码,应使用明确的时区。

答案 1 :(得分:2)

请使用现代的Java日期和时间API java.time,其他答案也是如此。我的版本是:

    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 tutorial: Date Time解释了如何使用java.time。