【问题标题】:Php for loops explaination [closed]PHP for循环解释[关闭]
【发布时间】:2015-05-28 02:41:56
【问题描述】:

我知道要在 PHP 中显示两个日期之间的日期,我们可以使用此代码

$tsDateFrom = date('2015-05-01');
$tsDateTo = date('2015-05-07');
for($i=$tsDateFrom;$i<=$tsDateTo;$i++) {
   echo $thisDate = $i."<br>" ;
}

展示

2015-05-01
2015-05-02
2015-05-03
2015-05-04
2015-05-05
2015-05-06
2015-05-07

但是这个怎么样?

$tsDateFrom1 = date('2015-05-01');
$tsDateTo1 = date('2015-05-07');
for($i=$tsDateFrom1;$i<=$tsDateTo1;$i = strtotime('+1 day', $i)) {
  echo $thisDate = $i."<br>";
}

显示

2015-05-01

我需要解释,因为我只是 php 新手,我想了解循环是如何工作的。为什么第二个循环只返回第一个日期?

【问题讨论】:

  • 看来您已关闭错误报告,因为当我运行您的第二个循环代码时,它显示E_NOTICE : type 8 -- A non well formed numeric value encountered。提示:它与循环无关,而是处理$i = strtotime('+1 day', $i)。提示提示:strtotime() 不会返回像 2015-05-01 这样的日期
  • @Sean 我想知道为什么第一个返回两个日期之间的所有日期,而第二个只返回第一个日期
  • 因为您的 $i = strtotime('+1 day', $i) 导致您的循环失败。您在第一个循环$i = 2015-05-01 上收到错误消息E_NOTICE : type 8 -- A non well formed numeric value encountered,但在第二个循环$i = 88415 上收到错误消息,因此它不再采用Y-m-d 的格式
  • 您需要先使用strtotime()$i 转换为时间戳,然后再将其转换回您的Y-m-d 格式。有点乱,但你可以做$i = date('Y-m-d, strtotime('+1 day', strtotime($i)))

标签: php


【解决方案1】:

首先,你没有正确使用date()

$d = date('2015-05-01');

这将根据您的模式格式化当前日期/时间,例如"Y-m-d",但由于缺少这些格式说明符,它只会返回您传递给它的内容,即字符串。

其次,strtotime() 期望第二个参数是时间戳,而不是字符串;当提供非数字字符串时,它会抱怨并返回您可能没想到的内容:

$ var_dump(strtotime('+1 day', '2015-05-07'));
PHP Notice:  A non well formed numeric value encountered in php shell code on line 1
int(88415)

如你所见,它也不返回字符串,而是一个表示时间戳的整数值。

你可以这样写:

$d = date('Y-m-d', strtotime("$d +1 day"));

但是,在这种情况下,最好使用 DatePeriod 代替:

$tsDateFrom = new DateTime('2015-05-01 00:00:00');
$tsDateTo = new DateTime('2015-05-07 23:59:59');

foreach (new DatePeriod($tsDateFrom, new DateInterval('P1D'), $tsDateTo) as $date) {
        echo $date->format('Y-m-d'), '<br>';
}

【讨论】:

    【解决方案2】:

    $i = strtotime('+1 day', $i) 返回一个整数,它在$i&lt;=$tsDateTo1 中不可比较。

    也许$i=date('m-d-Y',strtotime($i. "+1 days")); 会起作用。

    你可以看看PHP - add 1 day to date format mm-dd-yyyy....可能有用

    【讨论】:

    • OP 有Y-m-d 所以...date('m-d-Y',... 可能不是正确的代码示例。
    【解决方案3】:

    来自 PHP 文档:

    int strtotime ( string $time [, int $now = time() ] )
    

    函数期望得到一个包含英文日期的字符串 格式并将尝试将该格式解析为 Unix 时间戳( 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数),相对于 现在给出的时间戳,如果没有提供现在,则为当前时间。

    所以,例如:

    echo(strtotime("+1 day"));
    

    输出:

    1432868203
    

    然后,如您所见,strtotime() 不会以您期望的格式返回某些内容,因为您正在使用 yy-mm-dd。

    事实上,strtotime('+1 day', $i) 在你的代码中抛出了一个错误,因为你的循环失败了。

    两个建议:

    1. 阅读文档
    2. 打开 PHP 错误报告,这将告诉您错误在哪里。

    【讨论】:

    • 那么 strtotime("+1 day") 是什么意思?。是否意味着在当前日期时间上加一天?
    • 是的。但是你最大的问题是在你的 synyax 中。查看文档,检查您传递给strtotime() 的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2016-05-08
    • 2015-04-24
    • 2015-05-23
    相关资源
    最近更新 更多