【问题标题】:Time difference in seconds gives me wrong answers以秒为单位的时差给了我错误的答案
【发布时间】:2014-05-19 14:41:48
【问题描述】:

我有两个日期字符串,我想知道它们之间相差多少秒。

2014-05-19 16:37:36:690  // formattedDate
2014-05-19 19:38:00:000  // expString

我使用以下代码:

SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss:SSS");
Date d1 = null;
Date d2 = null;

d1 = sdf.parse(expString);
d2 = sdf.parse(formattedDate);


long diff = d1.getTime() - d2.getTime();
long exp = diff / 1000 % 60;

在此特定示例中,exp23。这里有什么问题?

【问题讨论】:

  • anything % 60 将始终在059 之间给出答案。你期待看到什么?
  • 更新后的结果是什么?因为这显然是您的问题的原因
  • 您期待什么答案?如果您查看要减去的日期(mod 60),您会得到60 - 36.69 = 23.31,当您将其转换为长整数时,它会四舍五入为23
  • 如果你不修改 60,你会得到10823 秒,即 3 小时 23 秒,这是这些日期之间的实际差异。

标签: java parsing date date-format


【解决方案1】:

.getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的时间(以毫秒为单位)。所以diff 有两个日期之间的毫秒时间。

long diff = d1.getTime() - d2.getTime();
// diff = 10882310

您使用整数除法以达到秒数,这会减少额外的毫秒数。

long temp = diff / 1000;
// temp = 10823

然后你模数为 60,得到秒数并忽略归因于分钟的秒数。

long exp = temp % 60;
// exp = 23

如果您想要两个日期之间的总时间(以秒为单位),您不想执行最后一个操作。

【讨论】:

  • 但是3小时不是83秒吗?
【解决方案2】:

不要使用模除法!只需使用普通除法:

long diff = d1.getTime() - d2.getTime();
long exp = diff / 1000;

更好的是,使用 JDK 中的 TimeUnit 枚举:

long exp = TimeUnit.MILLISECONDS.toSeconds(d1.getTime() - d2.getTime());

【讨论】:

    【解决方案3】:

    Joda-Time 提供了一个 Seconds 类来满足您的需求。

    Joda-Time 库还具有表示时间跨度的类:DurationIntervalPeriod。对于这个特定的问题,您并不严格需要它们,但它们对于相关工作会很方便。

    下面是一些未经测试的代码。

    为简单起见,请将您的字符串转换为严格的 ISO 8601 格式。将空格替换为T

    String inputStart = "…".replace( " ", "T" );
    // same for stop
    

    创建日期时间对象。显式分配一个时区来解析这些字符串。是 UTC 吗?

    DateTime startDateTime = new DateTime( inputStart, DateTimeZone.UTC );
    // repeat for stop
    
    long secs = Seconds.secondsBetween( startDateTime, stopDateTime ).getSeconds();
    

    【讨论】:

      猜你喜欢
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多