【问题标题】:Specific date given only returns today给出的具体日期仅在今天返回
【发布时间】:2021-05-28 17:30:20
【问题描述】:

我正在使用Calendar Recurring/Repeating Events - Best Storage Method上的代码

有人可以帮我让脚本从给定日期运行吗?该脚本运行良好,但它总是从今天开始。

我想改变: $now = strtotime("今天"); 到 $now = strtotime("2021-04-01");

//    $now = strtotime("today");
//$now = date( "Y-m-d", strtotime( "2009-01-31" ));
//$now = date("Y-m-d", strtotime("2014-12-31") );
//$now = "2013-04-11";
//$now = date("Y-m-d", strtotime("2015-04-01"))."\n";
//$now = strtotime('2007-12-21');
$now = strtotime('11-11-2007');
    $pushToFirst = 0;
    for($i = $pushToFirst; $i < $pushToFirst+3; $i++)
    {
        $now = strtotime("+".$i." day");
//$now = date("+".$i." day");
        $year = date("Y", $now);
        $month = date("m", $now);
        $day = date("d", $now);
        $nowString = $year . "-" . $month . "-" . $day;
        $week = (int) ((date('d', $now) - 1) / 7) + 1;
        $weekday = date("N", $now);
        echo $nowString . "<br />";
        echo $week . " " . $weekday . "<br />";
        $sql = "SELECT EV.*
                FROM `planering1` EV
                RIGHT JOIN `planering_namn` PN1 ON PN1.`NAMN` = EV.`namn`
                RIGHT JOIN `planering_meta` EM1 ON EM1.`event_id` = EV.`ID`
                WHERE ( DATEDIFF( '$nowString', repeat_start ) % repeat_interval = 0 )
                OR ( 
                    (repeat_year = $year OR repeat_year = '*' )
                    AND
                    (repeat_month = $month OR repeat_month = '*' )
                    AND
                    (repeat_day = $day OR repeat_day = '*' )
                    AND
                    (repeat_week = $week OR repeat_week = '*' )
                    AND
                    (repeat_weekday = $weekday OR repeat_weekday = '*' )
                    AND repeat_start <= DATE('$nowString')
                )";
        foreach ($dbConnect->query($sql) as $row) {
            print $row['namn'] . "\t";
            print $row['tur'] . "<br />";
        }
        echo "<br /><br /><br />";
    }

【问题讨论】:

  • 上述脚本与现代/最佳实践无关,因为它将变量直接注入到 sql 字符串中。带有绑定参数的准备好的语句是将变量输入查询的专业/现代方式。同样没有吸引力的是这个 sn-p 正在迭代查询(在一个循环中),这是非常糟糕的做法。我建议您不要使用您在网上找到的代码,而是寻找更专业的代码。
  • 代替嵌套的OR 条件,您可以使用IN() 简化它们。我从不赞成使用幻数86400,因为在某些边缘情况下,由于夏令时,添加这个秒数会失败——再次,使用更现代和更可靠的技术。

标签: php mysql strtotime recurring


【解决方案1】:

我会考虑更改这部分代码

// $now = strtotime('11-11-2007'); // remove this line
$start = strtotime('2021-04-01'); // the date you want to start with

    $pushToFirst = 0;
    for($i = $pushToFirst; $i < $pushToFirst+3; $i++)
    {
        //        $now = strtotime("+".$i." day"); // remove this line

        // there are 86400 secs in a day, this will increase the day based on the start date, rather then just taking +$i days from now
        $now = $start + ($i * 86400); 

编辑

strtotime 假设您正在谈论“现在”,作为默认参考点。因此,如果你说 strtotime("+1 day"),那就是从现在开始的 1 天,如果你说 strtotime("+5 days"),那就是从现在开始的 5 天。

有几种方法可以解决这个问题,

  1. strtotime 可以接受 2 个参数

https://www.php.net/manual/en/function.strtotime.php

strtotime("+1 day", $start), 将在参考点使用 $start。 所以 $start + 1day

  1. $now = $start + ($i * 86400); 这就是我选择使用的,每天有 86400 秒,所以我只是以秒为单位添加天数

两者都有相同的结果,使用对您来说更易读的任何一个。

【讨论】:

  • 问题是脚本总是使用今天的日期。我想把它改成给定的一天。
  • 在这 2 次更改中它仍然使用今天的日期吗?
  • 我首先拼错了您的解决方案并出现错误。现在它起作用了!谢谢!但我不明白有什么区别?为什么“+$i day”不起作用?为什么它使用今天的日期?
  • @andernicken 我在答案中添加了一些 cmets,以解释它是如何工作的
猜你喜欢
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多