【问题标题】:Interval between two dates is not integer in PHPPHP中两个日期之间的间隔不是整数
【发布时间】:2013-09-27 06:40:12
【问题描述】:

我用它来回显两个日期之间的间隔天数,但第二行回显一个浮点数。

echo (mktime(0,0,0,10,27,2013)-mktime(0,0,0,8,18,2013))/(3600*24).'<br>';
echo (mktime(0,0,0,10,28,2013)-mktime(0,0,0,8,18,2013))/(3600*24).'<br>';

结果:

70
71.041666666667

谁能告诉我为什么?谢谢!

【问题讨论】:

  • 不知道为什么,但似乎与时区设置有关,我在 php.ini 中更改为 date.timezone = Asia/Shanghai,现在得到整数(正确)结果
  • @user1466527 这不是关于它,阅读我的回答。
  • @Glavić 我不这么认为。检查没有使用 DST 的欧洲/莫斯科(如您在地图上所见)。都是关于数字的。当您更改时区时,mktime 的结果会更改为可被 3600*24 整除的数字。
  • @Glavić 我再次阅读了问题和我们的答案,我认为我们都是对的。你是对的,为什么mktime 结果会发生变化,我是对的,为什么这个表达式的结果是浮点数。
  • @Glavić 将Europe/Moscow 用于mktime(0,0,0,10,28,2013)-mktime(0,0,0,8,18,2013); 将返回浮点数。但是对于 mktime(0,0,0,10,27,2013)-mktime(0,0,0,8,18,2013); 将返回 int。检查它:)

标签: php date intervals mktime


【解决方案1】:

因为在 PHP 中进行除法时,总是会收到浮点数。

要获得 int,您必须对其进行舍入或强制转换。

 $int = (int) $float;

 $int = round($float, 0);

一个例外是两个操作数都是整数(或可以转换为整数的字符串)并且它们是可整除的。

【讨论】:

    【解决方案2】:

    结果:71.041666666667。谁能告诉我为什么?谢谢!

    回答:因为DST,您会得到这样的结果。

    我在 php.ini 中更改为 date.timezone = Asia/Shanghai,现在得到整数(正确)结果。

    因为Asia/Shanghai 时区不使用夏令时。例如尝试时区Europe/Berlin(谁使用夏令时),你会发现你有同样的问题:

    date_default_timezone_set('Asia/Shanghai');
    echo (mktime(0,0,0,10,28,2013)-mktime(0,0,0,8,18,2013))/(3600*24); # 71
    
    date_default_timezone_set('Europe/Berlin');
    echo (mktime(0,0,0,10,28,2013)-mktime(0,0,0,8,18,2013))/(3600*24); # 71.041666666667
    

    使用夏令时 [蓝色] |不再使用 DST [橙色] |从未使用过夏令时[红色]


    这就是为什么我总是建议使用DateTime 而不是mktime()strtotime() 和类似的函数。 DateTime 正确处理闰年和时区。

    $f = new DateTime('2013-08-18');
    $t = new DateTime('2013-10-28');
    echo $f->diff($t)->days; # 71
    

    或单线(PHP >= 5.4):

    echo (new DateTime('2013-08-18'))->diff(new DateTime('2013-10-27'))->days; # 71
    

    【讨论】:

    • 反对者:请让我知道我在这里做错了什么。谢谢。
    猜你喜欢
    • 2015-08-06
    • 2010-12-03
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2018-04-13
    相关资源
    最近更新 更多