【问题标题】:Error to calculate date diff with DateTime class使用 DateTime 类计算日期差异时出错
【发布时间】:2011-07-11 06:27:16
【问题描述】:

我正在尝试使用类 DateTime (php>=5.3) 来计算与 2 个日期的差异。

手册中的示例简单明了,我尝试了该示例并且效果很好。 但是如果更改开始和结束日期,就会出现问题:

        $this->start_date = '2011-03-01';
        $this->end_date = '2011-03-31';

        var_dump($this->start_date, $this->end_date);

        $datetime1 = new DateTime($this->start_date);
        $datetime2 = new DateTime($this->end_date);

        $interval = $datetime2->diff($datetime1);

        echo $interval->format('%a total days')."\n";
        echo $interval->format('%m month, %d days');

输出是:

30 total days     //ok
1 month, 2 days   //no! i think it should be 0 month, 30 days

与 March 一起工作不太好! :)

【问题讨论】:

  • 我的电脑吐出6015 total days1 month, 2 days。有趣...:D
  • @Czechnology 也许考虑 28 天的三月! :D 我没有尝试过其他月份,只有 Jan,它和手动示例一样运行良好。
  • 我做了一些测试,将日期设置为其他月份,在我看来,某处存在错误。 3 月有 28 天,4 月有 31 天。
  • 不是一个错误的说法。因为一个月不是一个固定的单位,所以它不会费心尝试针对给定情况更正计算。反正我就是这么读的。

标签: php datetime intervals


【解决方案1】:

二月不是有 28 天吗?出于某种原因,它可能会选择二月作为“月”单位。该方法的 PHP 文档似乎暗示这种事情很容易发生。无论如何,说“x 个月”并不过分有用,因为一个月不是一个固定的单位,它可能是 28、29、30 或 31 天。

从下面的PHP dateinterval format documentation 中提取。

DateInterval::format() 方法确实 不重新计算结转积分 时间字符串也不在日期段中。 这是预期的,因为它不是 可能会溢出像“32”这样的值 天”,可以解释为 从“1个月零4天”到 “1 个月零 1 天”。

【讨论】:

  • 我从 2011 年 1 月 1 日到 2011 年 1 月 31 日尝试了 1 月,输出为 0 个月,30 天....
  • 我并不是说它一定会假设一个月是 28 天(尽管在主要问题的示例中看起来确实如此)......我的意思是他们承认他们的这种转换将不准确的文档。在我看来,最好避免。
  • 感谢您的帮助!我想要间隔的天数,幸运的是它运行良好(格式(%a))......我不明白为什么 Jan 运行良好而其他没有......只是为了好奇! :)
  • 我也不知道,但如果没有它的源代码,我们永远不可能知道。如果你包括一月和二月,那么它会说什么......一个月30天,两个月59天......那么如果你将2个月1天与2个月1天进行比较,它们是否不相等,因为月份有不同的长度吗?真的有点雷区……我认为只走了几天就完全避免了,做得好:)
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多