【问题标题】:Get the EXACT difference between two dates获取两个日期之间的确切差异
【发布时间】:2017-02-03 18:33:54
【问题描述】:

我正在实施一个房地产应用程序,我需要准确检查两个日期之间的日期差异。 我更喜欢 javascript jquery 方法,但欢迎任何其他解决方案。

我的目标是不允许用户输入相差完全大于 2(或 5)年的日期。

我和其他许多人一起尝试过这个解决方案: How to get the months between 2 dates

不幸的是,这不是我真正需要的。

当我这样做时: 租金将从 01-01-2017 开始 并将于 31-12-2018 结束 我将获得 24 个月(准确租用 2 年),这对我的目的来说是正确的。

但如果我尝试: 租金将从 01-01-2017 开始 并将于 01-01-2019 结束 我仍将获得 24 个月(但租用 2 年零 1 天),这不符合我的目的。

由于我国(荷兰)的法律规定,上述两种情况之间的合同存在很大差异。

感谢您的帮助。

【问题讨论】:

  • 为什么不加2年减1天?
  • 附带说明 - 即使您使用 javascript,您也需要验证/检查此服务器端,否则结果不可靠(javascript / html可以由用户在提交前修改)。

标签: php jquery date


【解决方案1】:

如评论中所述,加 2 年并减 1 天。最好使用DateTime 类:

$dt = DateTime::createFromFormat('d-m-Y', '01-01-2017');

$dt->add(new DateInterval('P2Y'));
$dt->sub(new DateInterval('P1D'));

var_dump($dt->format('d-m-Y'));

这将产生预期的结果:

string(10) "31-12-2018"

【讨论】:

  • 感谢您的回复。我们不知道用户将输入的结束日期。这可能会超过两年。
  • 我尝试了您的解决方案。如果我使用开始日期为 01-01-2017,它将给我 31-12-2018,这是正确的(2 年)。但是当我使用诸如 15-01-2017 之类的开始日期时,它会给我 14-12-2019,即 3 年。有什么想法吗?
  • 我的错!从月中开始到下一年,这当然是合乎逻辑的。我会试试这个。感谢您发布您的答案
  • 我想说你还没有考虑过所有的边缘情况。例如,我无法预测您会允许用户输入15-01-2017 之类的内容。无论开始日期,您都需要获得明年的年底吗?请具体说明(双关语重言式:)))
  • 不,这很好。 15-01-2017 它会给我 14-12-2019 这只是我必须检查的两个租金年份。我接受了你的回答
【解决方案2】:

这是 SunilKmCharde 的一个出色的函数,来自 PHP 手册中的 User Contributed Notes

<?php
  //////////////////////////////////////////////////////////////////////
  //PARA: Date Should In YYYY-MM-DD Format
  //RESULT FORMAT:
  // '%y Year %m Month %d Day %h Hours %i Minute %s Seconds'        =>  1 Year 3 Month 14 Day 11 Hours 49 Minute 36 Seconds
  // '%y Year %m Month %d Day'                                    =>  1 Year 3 Month 14 Days
  // '%m Month %d Day'                                            =>  3 Month 14 Day
  // '%d Day %h Hours'                                            =>  14 Day 11 Hours
  // '%d Day'                                                        =>  14 Days
  // '%h Hours %i Minute %s Seconds'                                =>  11 Hours 49 Minute 36 Seconds
  // '%i Minute %s Seconds'                                        =>  49 Minute 36 Seconds
  // '%h Hours                                                    =>  11 Hours
  // '%a Days                                                        =>  468 Days
  //////////////////////////////////////////////////////////////////////
  function dateDifference($date_1 , $date_2 , $differenceFormat = '%a' )
  {
      $datetime1 = date_create($date_1);
      $datetime2 = date_create($date_2);

      $interval = date_diff($datetime1, $datetime2);

      return $interval->format($differenceFormat);

  }
?>

【讨论】:

    【解决方案3】:

    这应该是准确的,并注意闰年等...

    <?php    
    $date = date_create('02-01-2017');
    date_add($date, date_interval_create_from_date_string('2 years'));
    $twoyears = date_format($date, 'd-m-Y');
    echo $twoyears; // 02-01-2019
    
    $rentperiod = $twoyears->sub(DateInterval::createFromDateString('1 day'));
    echo $rentperiod; //01-31-2019
    

    【讨论】:

    • 面向对象的DateTime类更好,你至少不必记住闰年
    • 感谢您的回复。我们不知道用户将输入的结束日期。这可以超过两年的每一天。事实上,如果代替 01-01-2019 我做 02-01-2019 那么我使用的解决方案给了我 25 个月的时间,这对我的目的来说是正确的。
    • 除此之外会给我一个错误'Calling sub on string';
    【解决方案4】:

    Javascript:

    函数差异(d1,d2){ x = 新日期(d2-d1); 返回 x.getUTCDate() + " " + x.getUTCMonth() + " " + (x.getUTCFullYear() - 1970); }

    示例:

    a = new Date('01-01-2017');
    b = new Date('01-01-2019');
    diff(a,b);
    "Days:1, Months: 0, Years: 2"
    

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 2020-03-22
      • 2017-03-27
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多