【问题标题】:How would I fix the last day of the month errors that result with this php code?我将如何修复此 php 代码导致的每月最后一天的错误?
【发布时间】:2009-04-17 20:35:18
【问题描述】:

下面的代码是我用于网站菜单的代码,它将当月页面的链接移动到当月更改时的链接列表顶部。

但这在某些月份的 31 日失败,例如四月;对于大多数链接,我有两个指向同一个月的链接。我已经阅读了 php 生成日期方式的问题,但不知道如何更改此代码。

任何 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 />

【问题讨论】:

  • 你不看看这个并问自己“应该有更好的方法来做到这一点......”吗?循环和数组,仁慈的先生,循环和数组。
  • 我想有一种更好的方法,但我会一次只回答一个问题。我还在学习 php,而且大部分时间都知道网页的静态代码......

标签: php date mktime


【解决方案1】:

您可以考虑使用 strtotime() 代替 mktime。既然在strtotime()中就可以做到

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

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

【讨论】:

    【解决方案2】:

    &lt;?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 />";
    }
    ?>
    

    【讨论】:

    • 这很好用;其他答案在本月 31 日仍然失败。谢谢,马克
    【解决方案3】:

    在您的代码中使用 1 而不是 date('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
    }
    ?>
    

    【讨论】:

      【解决方案4】:

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

      <?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】:

        天哪,那是一些丑陋的代码。你真的应该看看Loops(for/while/etc)和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";
        }
        ?>
        

        【讨论】:

        • 这里也保留了原代码的问题:+$i 月对下个月不存在的日期无效。
        • 啊,你是对的,如果是 3 月 31 日之类的,它就会坏掉。将编辑,谢谢。
        • 是的,这是丑陋的代码。但我想我会一次问一个问题,也许有人会告诉我一个更好的方法......谢谢所有的答案 - 马克
        猜你喜欢
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        相关资源
        最近更新 更多