如何创建一个可以计算上个月最后一天日期的函数?

时间:2009-09-02 22:30:06

标签: php calendar date if-statement

我有一个PHP日历,列出了表中每月的所有日期。在每个月的第一天之前,我有上个月的数字,并且在该月的最后一天之后是下个月的天数。

这是目前看起来的日历照片。你可以看到底部的灰色数字工作正常,但是这个月的第一天之前的数字是负数,而应该显示为'29,30'

alt text

例如,该月最后一天之后的数字仅为'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天。此外,2月和闰年也是一个问题。有没有人知道if语句所以我可以让它显示为上个月的'28,29,30'?

6 个答案:

答案 0 :(得分:1)

也许这会有所帮助?

cal_days_in_month()

(编辑包括inshalla的反馈)

答案 1 :(得分:0)

为什么不采取该月第一天的时间戳,并从中减去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";
}

答案 2 :(得分:0)

假设$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吗?这是一种更健壮的方式来构建日历而不是所有这些特殊情况检查。

答案 3 :(得分:0)

看一下PHP-Calendar-Class项目的来源:

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

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

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

答案 4 :(得分:0)

使用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函数

答案 5 :(得分:0)

等一下......你的月份名称在顶部是错误的!它说“2009年8月”,但是这个月有30天,工作日也适合2009年9月!

在担心其他月份之前,您需要先修复当前月份。