【问题标题】:Timestamp1 is next day of timestamp2时间戳 1 是时间戳 2 的第二天
【发布时间】:2020-02-26 14:52:43
【问题描述】:

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

** 下一天不是 24 小时,而是下一个 DAY_OF_MONTH。例如:明天凌晨 1 点的时间戳是今天的第二天晚上 10 点。 (虽然只有 3 小时) - 因此 ts1 - ts2

首先我想提取出山的日子并比较增量,但这并不好,因为第二天可能是新月(或新年..)

我能想到的唯一解决办法是:

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

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

【问题讨论】:

标签: java timestamp


【解决方案1】:

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

【讨论】:

  • 非常感谢您的回答、冗长的解释和教程链接!
【解决方案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));


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

【讨论】:

  • 非常感谢!!由于您的突出显示,我错过了问题中的时区
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2022-01-22
  • 2015-04-20
  • 1970-01-01
  • 2017-10-21
  • 2021-06-11
相关资源
最近更新 更多