【问题标题】:Subtract two dates in Java [duplicate]在Java中减去两个日期[重复]
【发布时间】:2012-10-13 19:27:23
【问题描述】:

可能重复:
Calculating the Difference Between Two Java Date Instances

我知道这可能是一个重复的线程。但我试图找出一种方法来计算两个日期之间的差异。在 jquery 中,日期字符串的格式为 'yyyy-mm-dd'。我把它读成一个字符串并像这样转换为java Date

Date d1 = new SimpleDateFormat("yyyy-M-dd").parse((String) request.getParameter(date1));
Date d2 = new SimpleDateFormat("yyyy-M-dd").parse((String) request.getParameter(date2));

我想计算这两个日期之间的天数差。

注意:我不能使用需要审查的第三方 API。

【问题讨论】:

  • 你确定是mm而不是MM?
  • 有什么区别?根据地点等,有多种定义。看看各种 3rd 方时间 API,看看我的这条评论将走向何方。
  • 如果你认为它是一个dup,为什么不搜索它呢?又不是找不到其他线程...
  • @owlstead 我不能使用第三方应用程序,因为它需要经过法律团队的审查才能获得批准。所以我必须修补 util 包中可用的内容。
  • @user525146 您应该通过编辑将您的约束添加到问题中。似乎最普遍推荐的解决方案是使用第三方工具。如果不能,请提前说明。

标签: java date


【解决方案1】:

编辑 2018-05-28 我已将示例更改为使用 Java 8 的 Time API:

LocalDate d1 = LocalDate.parse("2018-05-26", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDate d2 = LocalDate.parse("2018-05-28", DateTimeFormatter.ISO_LOCAL_DATE);
Duration diff = Duration.between(d1.atStartOfDay(), d2.atStartOfDay());
long diffDays = diff.toDays();

【讨论】:

  • 这将在春季的夏令时边界上失败。示例(使用您的代码)d1 = new Date(112, 3-1, 11, 0, 0, 0)d2 = new Date(112, 3-1, 12, 0, 0, 0),结果为 0
  • 答案提供了一个截断的结果。对于四舍五入的结果:long diffDays = (diff + 12 * 60 * 60 * 1000) / (24 * 60 * 60 * 1000)
  • @SteveKuo,我知道这是不久前的事了,但是您有更好的解决方案,不会因夏令时而失败吗?我并不是要刻薄,我自己也在处理类似的问题,并且希望避免使用有明显缺陷的代码。
  • 这对我来说失败了,除了:java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds。对我有用的是:d1.until(d2).getDays(),其中d1d2 都创建为LocalDate.of(...)
【解决方案2】:

假设您受限于使用Date,您可以执行以下操作:

Date diff = new Date(d2.getTime() - d1.getTime());

在这里,您正在计算自“纪元”以来以毫秒为单位的差异,并在距纪元的偏移处创建一个新的 Date 对象。就像其他人所说的:重复问题中的答案可能是更好的选择(如果您没有被Date 束缚)。

【讨论】:

  • 请仔细阅读问题。您的回答回答了原来的问题。
  • 没关系,因为当您为自己寻找解决方案时它会有所帮助......这是我将用于我自己的问题的答案
【解决方案3】:
Date d1 = new SimpleDateFormat("yyyy-M-dd").parse((String) request.
            getParameter(date1));
Date d2 = new SimpleDateFormat("yyyy-M-dd").parse((String) request.
            getParameter(date2));

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

System.out.println("Difference between  " + d1 + " and "+ d2+" is "
        + (diff / (1000 * 60 * 60 * 24)) + " days.");

【讨论】:

  • 将在夏令时边界开始时失败。例如,d1=2012-3-11 和 d2=2012-3-12 结果为 0 天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 2012-10-13
  • 2015-01-03
  • 2012-06-07
  • 2020-02-03
相关资源
最近更新 更多