代码之家  ›  专栏  ›  技术社区  ›  markratledge

如何修复此php代码导致的每月最后一天错误?

  •  3
  • markratledge  · 技术社区  · 16 年前

    但在某些月份的31号,比如4月,这项计划失败了;我得到两个链接到同一个月的大部分链接。我已经通读了php生成日期的方式的问题,但不知道如何更改此代码。

    有人想尝试一下吗?谢谢

    <?php $month1 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+1 , date('d'), date('Y'))));
    $month2 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+2 , date('d'), date('Y'))));
    $month3 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+3 , date('d'), date('Y'))));
    $month4 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+4 , date('d'), date('Y'))));
    $month5 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+5 , date('d'), date('Y'))));
    $month6 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+6 , date('d'), date('Y'))));
    $month7 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+7 , date('d'), date('Y'))));
    $month8 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+8 , date('d'), date('Y'))));
    $month9 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+9 , date('d'), date('Y'))));
    $month10 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+10 , date('d'), date('Y'))));
    $month11 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+11 , date('d'), date('Y')))); ?>
    
    <a href="http://mydomain.com/<?php echo strtolower(date('F')); ?>/" title="<?php echo ucfirst(date('F')); ?>"><?php echo (date('F')); ?></a><br />
    
    <a href="http://mydomain.com/<?php echo strtolower($month1); ?>/" title="<?php echo $month1; ?>"><?php echo $month1; ?></a><br />
    
    ...(2 through 10)...
    
    <a href="http://mydomain.com/<?php echo strtolower($month11); ?>/" title="<?php echo $month11; ?>"><?php echo $month11; ?></a><br />
    
    5 回复  |  直到 13 年前
        1
  •  4
  •   Ólafur Waage    16 年前

    strtotime() 而不是时间。因为在strotime()中可以

    strtotime("-1 day", time());
    

    在某个月的第一天,它会精确地回到某一天。甚至以闰年计算。

        2
  •  2
  •   scronide    16 年前

    在代码中使用1代替日期('d');但是,当您看到重复的代码时(其中只有一些代码发生了更改),您应该考虑循环:

    <?php
    for ($i = 0; $i < 12; $i++) {
        $month = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y')));
    ?>
    
        <a href="http://mydomain.com/<?php echo strtolower($month); ?>" title="<?php echo $month; ?>"><?php echo $month; ?></a><br />
    
    <?php
    }
    ?>
    
        3
  •  2
  •   Eddy    16 年前

    <?php

    $current_month = date('n');
    $MONTHS = array();
    for ($m=0; $m<12; $m++) {
      $display_month = $m + $current_month;
      $MONTHS[] = date('F',mktime(1,1,1,$display_month,1,date("Y")));
    }
    foreach ($MONTHS as $month) {
      echo "
        <a
          href=\"http://mydomain.com/".strtolower($month)."\"
          title=\"$month\">$month</a><br />";
    }
    ?>
    

        4
  •  0
  •   elzapp    16 年前

    我不知道这是否解决了您的问题,因为我不确定我是否理解问题所在,但我知道如何使此代码更具可读性:

    <?php 
        $month1 = date('F', strtotime("+1 month"));
        $month2 = date('F', strtotime("+2 month"));
        $month3 = date('F', strtotime("+3 month"));
        $month4 = date('F', strtotime("+4 month"));
        $month5 = date('F', strtotime("+5 month"));
        $month6 = date('F', strtotime("+6 month"));
        $month7 = date('F', strtotime("+7 month"));
        $month8 = date('F', strtotime("+8 month"));
        $month9 = date('F', strtotime("+9 month"));
        $month10 = date('F', strtotime("+10 month"));
        $month11 = date('F', strtotime("+11 month"));
    ?>
    

    (但我也同意Chad Birch关于使用循环而不是重复代码的说明)

    <?php
        foreach(range(0,11) as $key){
            $months[$key]=date('F', strtotime("+{$key} month"));
        }
    /* ... */
        foreach($months as $month){
            print "<a href='http://mydomain.com/".strtolower($month).
                "' title='".$month."'>".$month."</a><br />";
        }
    ?>
    
        5
  •  0
  •   Chad Birch    16 年前

    哦,天哪,这是一些丑陋的代码。你真的应该调查一下 Loops (用于/同时/等)和 Arrays .

    您的代码可以简化为:

    : 我的代码与原来的代码有相同的问题,使用scronide的解决方案修复了这个问题,感谢您指出。

    <?php
    for ($i = 0; $i < 12; $i++)
    {
        $months[$i] = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y')));
    }
    
    for ($i = 0; $i < 12; $i++)
    {
        print '<a href="http://mydomain.com/'.strtolower($months[$i]).'/" title="'.$months[$i].'">'.$months[$i]."</a><br />\n";
    }
    ?>
    

    或者,如果您不介意将这两个功能(获取月份名称和打印链接)组合在一起,并且您不需要为其他任何事情存储月份名称:

    <?php
    for ($i = 0; $i < 12; $i++)
    {
        $month = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y')));
        print '<a href="http://mydomain.com/'.strtolower($month)."/\" title=\"$month\">$month</a><br />\n";
    }
    ?>