1

1週間前、今日、1週間後の誕生日を持つメンバーのリストを生成する関数を作成しました。機能は

$m= date("m"); // Month value
        $de= date("d"); //today's date
        $y= date("Y"); // Year value

for($i=0;$i<count($members);$i++){
            $m_bday = strtotime($members[$i]->dob);
            $bday_date = date('d',$m_bday);
            $bday_month = date('m',$m_bday);
            $bday = strtotime(date('Y-m-d',mktime(0,0,0,$bday_month,$bday_date,$y)));
            //echo $bday_date."</br>".$bday_month."</br>".$members[$i]->dob."</br>".date('Y-m-d',$bday);exit;
            $week_before = strtotime(date('Y-m-d', mktime(0,0,0,$m,($de-7),$y)));
            $week_after = strtotime(date('Y-m-d', mktime(0,0,0,$m,($de+7),$y)));

            if(date('d-m') == date('d-m',$bday)){
                $this->present_bday[] = array('mem_name'=> $members[$i]->name);
            }
            else if(date('d-m',$week_before) <= date('d-m',$bday) && date('d-m',$bday) < date('d-m')){
                $this->past_bday[] = array('mem_name' => $members[$i]->name);
            }
            else if(date('d-m')< date('d-m',$bday) && date('d-m',$bday) <= date('d-m',$week_after)){
                $this->future_bday[] = array('mem_name' => $members[$i]->name);
            }
        }

データベースから返される日付形式はyyyy-mm-ddie1960-06-12です。このコードは、1 週間前と今日は正常に機能しますが、年が 1970 年未満の場合は戻ってから 1 週間、状態が完全に失敗してから 1 週間後です。

正しい結果を得るための適切な日付操作を誰かに教えてもらえますか?

4

5 に答える 5

3

あなたの問題はstrtotime、UNIXエポックからの秒数を返すためだと思いますが、それは実際には1970年です。データベースで日付を直接比較することをお勧めします:SELECT ADDDATE('2008-01-02', INTERVAL 1 WEEK);またはSELECT SUBDATE('2008-01-02', INTERVAL 1 WEEK);

次のようにすることもできます。

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
if((integer) $interval->format('%R%a') > 7) // More than week
于 2012-11-02T06:32:02.327 に答える
1

これを試して:

    <?php
$m= date("m"); // Month value
        $de= date("d"); //today's date
        $y= date("Y"); // Year value

for($i=0;$i<count($members);$i++){

            $mem_bod_explode=explode("-",$members[$i]->dob);
            $m_bday = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2],$y);
            //$bday_date = date('d',$m_bday);
            //$bday_month = date('m',$m_bday);
            //$bday = $m_bday;
            //echo $bday_date."</br>".$bday_month."</br>".$members[$i]->dob."</br>".date('Y-m-d',$bday);exit;

            $week_before = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2]-7,$y);
            $week_after = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2]+7,$y);

           echo  date('Y-m-d',$week_before);
           echo"<br>";
           echo  date('Y-m-d',$week_after);
           echo"<br>";
           echo date('Y-m-d');

            if(date('Y-m-d') == date('Y-m-d',$m_bday)){
                $present_bday[] = array('mem_name'=> $members[$i]->name);
            }
            else if(date('Y-m-d',$m_bday)<date('Y-m-d') && date('Y-m-d',$m_bday)>=date('Y-m-d',$week_before)){
                $past_bday[] = array('mem_name'=> $members[$i]->name);
            }

            else if(date('Y-m-d',$m_bday)>date('Y-m-d') && date('Y-m-d',$m_bday)<=date('Y-m-d',$week_after)){
                $future_bday[] = array('mem_name'=> $members[$i]->name);
            }


        }



        ?>
于 2012-11-02T07:40:24.133 に答える
0

データベースクエリ自体の日付を比較すると、次のようなものが思い浮かびました

$res = $this->db->query("SELECT * FROM members WHERE DAYOFYEAR(curdate()) - 7 <= dayofyear(dob) AND DAYOFYEAR(curdate()) +7 >= dayofyear(dob);")->result();
$weekbfr_mem = $this->db->query("SELECT * FROM members WHERE DAYOFYEAR(curdate()) - 7 <= dayofyear(dob) AND dayofyear(dob) < DAYOFYEAR(curdate());")->result();
$bday_mem = $this->db->query("SELECT * FROM members WHERE DAYOFYEAR(curdate()) = dayofyear(dob);")->result();
$weekafter_mem = $this->db->query("SELECT * FROM members WHERE DAYOFYEAR(curdate()) < dayofyear(dob) AND dayofyear(dob) <= DAYOFYEAR(curdate()+7);")->result();

これの主な欠点は、プロジェクトの速度が遅いサーバーに3つのクエリを作成する必要があるため、php関数自体で実行することについてのアイデアです。

于 2012-11-02T10:08:52.007 に答える
0

このコードを試してください。これがお役に立てば幸いです。

$m= date("m"); // Month value
        $de= date("d"); //today's date
        $y= date("Y"); // Year value

for($i=0;$i<count($members);$i++){

            $mem_bod_explode=explode("-",$members[$i]->dob);
            $m_bday = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2],$mem_bod_explode[0]);
            $bday_date = date('d',$m_bday);
            $bday_month = date('m',$m_bday);
            $bday = $m_bday;
            //echo $bday_date."</br>".$bday_month."</br>".$members[$i]->dob."</br>".date('Y-m-d',$bday);exit;
            $week_before = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2]-7,$mem_bod_explode[0]);
            $week_after = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2]+7,$mem_bod_explode[0]);

            if(date('d-m') == date('d-m',$bday)){
                $this->present_bday[] = array('mem_name'=> $members[$i]->name);
            }
            else if(date('d-m',$week_before) <= date('d-m',$bday) && date('d-m',$bday) < date('d-m')){
                $this->past_bday[] = array('mem_name' => $members[$i]->name);
            }
            else if(date('d-m')< date('d-m',$bday) && date('d-m',$bday) <= date('d-m',$week_after)){
                $this->future_bday[] = array('mem_name' => $members[$i]->name);
            }
        }
于 2012-11-02T06:53:25.623 に答える
0
Try the below code for testing:
I have putted date 1983-10-30 and its showing in Past.

<?php
    $m= date("m"); // Month value
            $de= date("d"); //today's date
            $y= date("Y"); // Year value

    for($i=0;$i<1;$i++){

                $mem_bod_explode=explode("-","1983-10-30");
                $m_bday = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2],$y);
                //$bday_date = date('d',$m_bday);
                //$bday_month = date('m',$m_bday);
                //$bday = $m_bday;
                //echo $bday_date."</br>".$bday_month."</br>".$members[$i]->dob."</br>".date('Y-m-d',$bday);exit;

                $week_before = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2]-7,$y);
                $week_after = mktime(0,0,0,$mem_bod_explode[1],$mem_bod_explode[2]+7,$y);

               echo  date('Y-m-d',$week_before);
               echo"<br>";
               echo  date('Y-m-d',$week_after);
               echo"<br>";
               echo date('Y-m-d');

                if(date('Y-m-d') == date('Y-m-d',$m_bday)){
                    $present_bday[] = array('mem_name'=> "fgfg");
                }
                else if(date('Y-m-d',$m_bday)<date('Y-m-d') && date('Y-m-d',$m_bday)>=date('Y-m-d',$week_before)){
                    $past_bday[] = array('mem_name' => "gfgfg");
                }

                else if(date('Y-m-d',$m_bday)>date('Y-m-d') && date('Y-m-d',$m_bday)<=date('Y-m-d',$week_after)){
                    $future_bday[] = array($members[$i]->name);
                }


            }
            echo"<br>";
         echo"Past Birthday:<br>";   
         print_r($past_bday);
         echo"<br>";

         echo"Present Birthday:<br>";   
         print_r($present_bday);
         echo"<br>";

         echo"Future Birthday:<br>";   
         print_r($future_bday);
         echo"<br>";

            ?>
于 2012-11-02T10:37:18.887 に答える