【问题标题】:Calculate number of day between two dates [duplicate]计算两个日期之间的天数[重复]
【发布时间】:2012-12-07 00:52:28
【问题描述】:

可能重复:
How to find number of days between two dates using php

我不想知道如何做到这一点。我想知道为什么它没有给出预期的结果。

我尝试计算格式为 YYYY-mm-dd 的两个日期之间的天数 使用此代码:

$day1 = strtotime($_REQUEST['start']);
$day2 = strtotime($_REQUEST['end']);

$nbOfDays = $day2 - $day1;
$nbOfDays = ceil($nbOfDays/60/60/24);

echo $nbOfDays;

问题是当我计算 2012-12-01 和 2012-12-31 之间的差异时,它给了我 30 天(应该是 31) 而且 2012-11-01 和 2012-11-30 之间的差值也是 30(没错!)

更新纯信息:

我不得不修改这段代码(感谢贾斯汀):

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$interval = round(abs($day2->format('U') - $day1->format('U')) / (60*60*24));
echo $interval;

为:

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$nb1 = $day2->format('U');
$nb2 = $day1->format('U');
$interval = round(abs($nb1 - $nb2) / (60*60*24));
echo $interval;

因为

$day2->format('U') - $day1->format('U')

等于 0

所以最后,2012-12-31 和 2012-12-01 之间的差值仍然是 30。BUUUTTTT,2012-11-30 和 2012-11-01 之间的差值是 29,所以

echo $interval +1;

在任何情况下都给出正确的天数!

【问题讨论】:

  • 好吧,我真的不想知道该怎么做。我想知道为什么某些日期的结果是正确的,而其他日期的结果却不正确。
  • 1+30=31; 30 是正确的 12 月。 11 月似乎给出了 29.041,而你的上限是 30。不知道为什么它给出了这个数字..我认为 DST 开关是在 10 月..但也许还有其他类型的时间调整,它关闭了一个小时或所以。
  • (你们为什么不赞成他?他的问题表述得很好)
  • 我认为这个问题所需的日期算术有点专业,因为 OP 似乎需要开始和结束日期跨越的天数,而不是 这些日期之间的差异(以天为单位)。 2012-12-01 和 2012-12-31 之间有 30 天,2012-11-01 和 2012-11-30 之间有 29 天,但 OP 分别需要 31 和 30 天。 strtotime()local 时间工作,因此将本地时区设置为 UTC 以避免任何夏令时差异抛出结果。

标签: php html date web


【解决方案1】:

您应该使用 date_diff() 或其 OO 等效项 DateTime::diff() 来获取日期/时间差异。

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$interval = $day1->diff($day2);
echo $interval->format('%d');

对于 PHP 5.2 版,您可以使用以下内容:

$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$interval = round(abs($day2->format('U') - $day1->format('U')) / (60*60*24));
echo $interval;

对于 5.2 之前的 PHP 版本,使用 strtotime() 和上面的公式:

$day1 = strtotime($_REQUEST['start']);
$day2 = strtotime($_REQUEST['end']);
$interval = round(abs($day2 - $day1) / (60*60*24));
echo $interval;

【讨论】:

  • 很好的答案,但我们的客户使用的是 php 版本
  • 听起来是时候升级或寻找更好的客户了。 ;)
  • 同一个客户端正在使用 Register_global 和 magic_quote_gpc.. 抱歉 :((不,我们没有编写他们的软件)
  • $today 和 $start 来自哪里? :P
猜你喜欢
  • 2011-10-29
  • 2019-02-10
  • 2014-07-08
  • 1970-01-01
  • 2015-02-26
  • 2019-09-27
相关资源
最近更新 更多