【问题标题】:How can I create a function that can figure out the previous month's last day dates?如何创建一个函数来计算上个月的最后一天日期?
【发布时间】:2010-11-25 02:58:06
【问题描述】:

我有一个 PHP 日历,它在表格中列出了一个月中的所有日子。在该月的第一天之前,我有上个月的数字,而在该月的最后一天之后是下个月的天数。

这是日历的当前外观照片。如您所见,底部的灰色数字工作正常,但该月第一天之前的数字是负数,应该显示为“29,30”

例如,当月最后一天之后的数字只是“32,33,34”,所以我创建了一个 if 语句来检查该数字是否大于当月的总天数,如果因此,然后从“32”中减去该月的总天数,例如,这将使其显示为“1,2,3”。

if ($day > $total_days_of_current_month) {
  echo '<td>' . ($day - $total_days_of_current_month) . ' </td>'; // for example,33-31=2
}

我的问题是创建一个 if 语句,它以某种方式知道上个月的最后几天是什么。问题是有些月份有 30 天,有些月份有 31 天。此外,二月和闰年也是一个问题。有谁知道 if 语句,所以我可以让它显示为上个月的“28,29,30”?

【问题讨论】:

    标签: php calendar date if-statement


    【解决方案1】:

    等一下...您在顶部的月份名称是错误的!上面写着“2009 年 8 月”,但这个月有 30 天,而工作日正好是 2009 年 9 月!

    您需要先修复当前月份,然后再担心其他月份。

    【讨论】:

      【解决方案2】:

      使用cal_days_in_month(),如何添加如下代码:

      if ($day < 1) {
        echo '<td>' . ($day + cal_days_in_month(
           CAL_GREGORIAN,date_format("n",
               date_add(date_create(),"P-1M")))) . ' </td>'; // for example,-1 + 30 = 29th
      }
      

      已编辑:添加 date_format 函数

      【讨论】:

        【解决方案3】:

        看看PHP-Calender-Class项目的源码:

        http://code.google.com/p/php-calendar-class/

        类源:http://code.google.com/p/php-calendar-class/source/browse/trunk/calendar.class.php

        它可能会让您对问题有所了解。

        【讨论】:

          【解决方案4】:

          也许这有帮助?

          cal_days_in_month()

          (已编辑以包含 inshalla 的反馈)

          【讨论】:

          • 我相信函数名都是小写的,你真的应该链接到官方文档:us2.php.net/manual/en/function.cal-days-in-month.php
          • 感谢 Inshalla,链接已指向官方网站(我并没有过多地向下滚动 google 结果)。
          • 有很多方法可以做到这一点。例如,使用 PHP 的日期/时间函数之一: date('t', strtotime('previous month'))
          【解决方案5】:

          假设 $day 是一个 UNIX 时间戳:

          // gets you the first of the month
          $date = getdate(mktime(0, 0, 0, date('n', $day), 1, date('Y', $day)));
          

          从这里,执行以下操作之一:

          $lastDayOfPrevMonth = strtotime('-1 day', $date[0]);
          
          // or, better, get the first day "in the grid" (assuming week starts on Sunday)
          $date = strtotime("-$date[wday] days", $date[0]);
          

          我不想竖起大拇指,但你看过我的previous answer吗?这是构建日历而不是所有这些特殊情况检查的更强大的方法。

          【讨论】:

          • 我正在使用这个 php 日历:iambari.com/2009/05/05/…,我似乎无法弄清楚如何实施您的解决方案。我只是不知道在哪里添加它。
          • 好吧,如果你要破解一个已经存在的脚本,那确实可能有点困难。我之前的回答只是演示了一种构建整个日历表的不同方式,从而避免了您面临的所有问题。我的解决方案是一天一天地通过实际日期,然后弄清楚如何显示它,而不是通过数字 1 - 31 并试图弄清楚它是哪一天。您可能必须重写当前脚本的大部分内容才能做到这一点。
          • 从不迟于当月第一天的最后一个星期日开始,而不是从当月的第一天开始。这可以解决所有问题。
          【解决方案6】:

          为什么不直接取当月第一天的时间戳,减去 24 小时,然后使用 date('d', $timestamp); 呢?此外,如果您有该月的时间戳,date('t', $timestamp); 将为您获取该月的天数。

          一个简单的例子:

          // sets to 3am, first day of month, 3am helps us avoid DST issues with subtracting hours    
          $monthStart = mktime(3,0,0,date('n'),1,date('Y')); 
          $thisMonth = date('n', $monthStart);
          
          // rewind to the sunday before- date('w') is the "weekday" 0 based    
          $date = $monthStart - (date('w',$monthStart) * 60 * 60 * 24);     
          
          while ($date<$monthStart || date('n', $date) == $thisMonth)
          {
            echo "<tr>";
            for ($x=0; $x<7; $x++) {
              echo "<td";
              if (date('n', $date) != $thisMonth) echo " class='notMonth'";
              echo ">";
              echo date("j", $date);
              echo "</td>";
              $date += 60*60*24;
            }
            echo "</tr>\n";
          }
          

          【讨论】:

          • 您应该减去 1 天,而不是减去 24 小时。原因是有时几天的时间多于或少于 24 小时(例如夏令时、闰秒等),如果它发生在当月 1 日,您的计算就会出错。
          • 这就是为什么我将原始日期的时间设置为凌晨 3 点,DST 的 +/- 1 小时不会使日期变得异常。生成日历时,小时无关紧要。
          猜你喜欢
          • 2010-09-18
          • 2012-03-12
          • 2014-03-08
          • 1970-01-01
          • 2022-01-01
          • 1970-01-01
          • 2016-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多