【问题标题】:How to find day difference between 2 timestamp in java [duplicate]如何在java中找到2个时间戳之间的日差[重复]
【发布时间】:2019-05-26 08:31:15
【问题描述】:

我想计算两个时间戳之间的天差,但我不想考虑时间差。

例如:

long time1 = 1546258765000  (Mon 31 December 2018 13:19:25)
long time2 = 1546005915367 (Fri 28 December 2018 15:05:15)

结果应该是 3, 3 天过期... 由于时间的关系,我从这个方法中得到了 2 个:

TimeUnit.DAYS.convert(time1 - time2 , TimeUnit.MILLISECONDS))

我只需要为 time1 和 time2 设置相同的时间,然后返回时间戳并像这样计算......但我不确定最好的方法是什么。

【问题讨论】:

  • 你在哪个时区?似乎您处于 UTC 偏移 +01:00?您需要确定一个时区才能将您的 long 值转换为日期。

标签: java datetime


【解决方案1】:

注意: 正如 Ole V.V 所指出的:这仅适用于 UTC。由于时间戳始终使用 UTC,如果您在另一个时区,它可能会返回不希望的结果。示例:

格林威治标准时间 + 1:

time1 = 1546216200000L (Mon 31 December 2018 01:30:00) (31/12 00:30 on UTC)
time2 = 1545953400000L (Fri 28 December 2018 00:30:00) (27/12 11:30 on UTC)

这将导致 4 天的差异,因为这是 UTC 的差异。

为了弥补这一点,您应该抵消差异,以便时间戳显示您的当前时间,而不是 UTC 时间。 (例如,如果您在 GMT+1 中,则需要为每个时间戳添加 1 小时(3600000 毫秒)。


我相信最简单的方法可能是使用模块:

final long MILLIS_PER_DAY = 1000*60*60*24;
long time1 = 1546258765000L; // (Mon 31 December 2018 13:19:25)
long time2 = 1546005915367L; // (Fri 28 December 2018 15:05:15)

// Set both times to 0:00:00
time1 -= time1 % MILLIS_PER_DAY;
time2 -= time2 % MILLIS_PER_DAY;

然后

TimeUnit.DAYS.convert(time1 - time2 , TimeUnit.MILLISECONDS))

应该会给你想要的结果。

【讨论】:

  • time1 % MILLIS_PER_DAY 始终为 0
  • 不,不是。我只是测试了一下,以防我打错了东西,但它工作得很好
  • 你完全正确,是我的错,非常感谢你的帮助
  • 这将给出 UTC 的预期结果。在其他时区有时会,有时结果会是一天太多或太少。该算法非常适合我的口味。我宁愿把更多的工作留给库方法。
  • 我在欧洲/哥本哈根时区。我用 time1 = 1546216200000L(2018 年 12 月 31 日星期一 01:30:00)和 time2 =1545953400000L(2018 年 12 月 28 日星期五 00:30:00)尝试了您的代码。预期差异:3 天。打印差异:4 天。您的代码在 UTC 之外给出了不正确的结果。
【解决方案2】:

使用joda-time库:

long time1 = 1546258765000L;
long time2 = 1546005915367L;
DateTime dateTime1 = new DateTime(time1);
DateTime dateTime2 = new DateTime(time2);
int hours = Hours.hoursBetween(dateTime2, dateTime1).getHours();
int days = hours % 24 == 0 ? hours / 24 : hours / 24 + 1;
System.out.println(days);

joda-time lib 有计算两个时间间隔天数的方法,但结果不是你想要的:

Days.daysBetween(dateTime1,dateTime2).getDays()

【讨论】:

    【解决方案3】:

    将毫秒转换为LocalDateTime,然后计算Duration

    LocalDateTime start = LocalDateTime 
            .ofInstant(Instant.ofEpochMilli(1546005915367L), ZoneId.systemDefault())
            .truncatedTo(ChronoUnit.DAYS);
    
    LocalDateTime stop = LocalDateTime
            .ofInstant(Instant.ofEpochMilli(1546258765000L), ZoneId.systemDefault())
            .truncatedTo(ChronoUnit.DAYS);
    
    Duration duration = Duration.between(start, stop);
    
    long dayDifference = duration.toDays(); 
    

    【讨论】:

    • 非常感谢您的帮助!
    • 此答案中代码中的truncatedTo 调用对于获得精确结果至关重要(另一种方法是转换为LocalDate,因为这也会截断)。
    【解决方案4】:

    将给定单位中的给定持续时间转换为此单位。 从细粒度到粗粒度的转换会截断,因此会丢失精度。例如,将999 毫秒转换为秒会得到0

    https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#convert(long,%20java.util.concurrent.TimeUnit)

    【讨论】:

    • 我相信他知道这一点,至少在他知道他必须将两个日期设置为同一时间的意义上。
    猜你喜欢
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多