Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP语言中的日历_Php_Calendar - Fatal编程技术网

PHP语言中的日历

PHP语言中的日历,php,calendar,Php,Calendar,我有一个php日历,我只想知道两件简单的事情 如何使日历在非星期日的一天开始?(例如,第1天=星期一) 如何使所有星期天都显示为红色 Thx,下面是代码: <!DOCTYPE HTML> <html lang="pt-br"> <head> <meta charset="UTF-8"> <title>Calendário em PHP</title> <?php date_de

我有一个php日历,我只想知道两件简单的事情

如何使日历在非星期日的一天开始?(例如,第1天=星期一)

如何使所有星期天都显示为红色

Thx,下面是代码:

<!DOCTYPE HTML>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Calendário em PHP</title>
    <?php 
        date_default_timezone_set('America/Sao_Paulo');
    ?>
</head>
<body>
    <h1>Estamos em <?php echo date('Y');?></h1>
        <p>Hoje é dia <strong><?php echo date('d / '); ?></strong>
            <?php echo date('m'); ?>
            agora são <?php echo date ('H'); ?>horas e
            <?php echo date('i');?> minutos.</p>

        <?php
            function linha($semana){
                echo "<tr>";
                for ($i = 0; $i <=6; $i++){
                    if(isset($semana[$i])){
                        echo "<td>{$semana[$i]}</td>";
                    } else{
                        echo "<td></td>";
                    }
                }
                echo "</tr>";
            }
            function calendario(){
                $dia = 1;
                $semana = array();

                while($dia <= 31){
                    array_push($semana, $dia);
                    if(count($semana) == 7){
                        linha($semana);
                        $semana = array();
                    }
                    $dia++;
                }
                linha($semana);
            }
        ?>
        <table border="1">
            <tr>
                <th>Dom</th>
                <th>Seg</th>
                <th>Ter</th>
                <th>Qua</th>
                <th>Qui</th>
                <th>Sex</th>
                <th>Sáb</th>
                <?php calendario(); ?>
            </tr>
        </table>
</body>
</html>

卡伦德里奥酒店
埃斯塔莫斯埃姆
霍杰迪亚
圣霍拉斯广场
分钟

多姆 赛格 特 夸 魁 性 萨博
函数date()提供了很多方法来比较一周中的哪一天。显然,您需要告诉PHP参考日期,以便PHP知道参考日期

在您的示例中,您可以设置引用的时间戳,并使用date('N',$current\u timestamp):

  • 您可以与循环中的一周中的某一天(1=周一到7=周日)进行比较,使日历只从您想要的那一天开始
  • 您可以检查==到7(星期日)
  • 你可以看看是不是今天
  • 等等
我使用此函数重写了日历函数:

    <?php

$calendar = "";
$current_time = mktime(0, 0, 0, date("n"), 1) - 604800; // say, we start at the first day of the current month.


$days = "";


    for ($w = 1 ; $w <=5 ; $w++) // how many weeks to display.
    {
        $week = "";
        $days = "";

        for ($j = 1 ; $j <=7 ; $j++) // for each day slot in your week
        {

            if($j != date('N', $current_time)) 
            {
                $days .= "";    // if the current looped day is not corresponding to the day in the calendar column, then empty slot and we don't increment the day until it matches.
                $j=$j-1;
            }
            else if(date('Ymd') == date('Ymd', $current_time))
            {
                $days .= "<td style=\"background-color:yellow;\">" . date('j', $current_time) . "</td>\n"; // if the day is today, then print in the calendar in yellow.
            }
            else if ($j == 7)
            {
                $days .= "<td style=\"background-color:red;\">" . date('j', $current_time) . "</td>\n"; // if Sunday, then in red.
            }
            else
            {
                $days .= "<td>" . date('j', $current_time) . "</td>\n"; // if the day corresponds but is not today, then print in the calendar (white).
            }

            $current_time = $current_time + 86400;
        }

        $week .= "<tr>" . $days . "</tr>\n";

        $calendar .=  $week;
    }


echo ("<table cellspacing=\"2\" border=\"1\">
\t<tr>
\t<th>M</th>
\t<th>T</th>
\t<th>W</th>
\t<th>T</th>
\t<th>F</th>
\t<th>S</th>
\t<th>S</th>
</tr>" . $calendar . "</table>");

?>
以下是我的解决方案:

<!DOCTYPE HTML>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Calendário em PHP</title>
    <?php 
        date_default_timezone_set('America/Sao_Paulo');

        $hoje = getdate();

        $ultimoDia = cal_days_in_month(CAL_GREGORIAN,
                                       $hoje['mon'],
                                       $hoje['year']);

        $primeiraSemana = (($hoje['wday'] + 1) -
                          ($hoje['mday'] - ((int)($hoje['mday'] / 6) * 7))) % 7;
        // Alternativa:
        /*$primeiroDiaTimestamp = strtotime(sprintf("%d-%0d-01",
                                                  $hoje['year'],
                                                  $hoje['mon']));
        $primeiraSemana = (int)date('w', $primeiroDiaTimestamp);*/
    ?>

    <style>
        td[data-semana="0"] { color: #ff0000; }
    </style>
</head>
<body>
    <h1>Estamos em <?= $hoje['year'] ?></h1>
    <p><?= sprintf('Hoje é dia <strong>%0d / %0d</strong>, agora são %02d horas e %0d minutos.',
                   $hoje['mday'], $hoje['mon'], $hoje['hours'], $hoje['minutes'])
    ?></p>

    <table border="1">
        <tr>
            <th>Dom</th>
            <th>Seg</th>
            <th>Ter</th>
            <th>Qua</th>
            <th>Qui</th>
            <th>Sex</th>
            <th>Sáb</th>
        </tr>
        <tr>
        <?php
        for($semana = 0; $semana < $primeiraSemana; ++$semana) {
            echo '<td>&nbsp;</td>';
        }
        for($dia = 1; $dia < $ultimoDia; ++$dia) {
            if( $semana > 6 ) {
                $semana = 0;
                echo '</tr><tr>';
            }

            echo "<td data-semana=\"$semana\">";
            echo "$dia</td>";
            ++$semana;
        }
        for(; $semana < 7; ++$semana) {
            echo '<td>&nbsp;</td>';
        }
        ?>
        </tr>
    </table>
</body>
</html>
我提出的解决方案使用算术计算来确定一个月的第一个工作日是什么,知道当前的月份和星期:

$today = getdate();
$firstWeekdayOfTheMonth = (($today['wday'] + 1) - ($today['mday'] - ((int)($today['mday'] / 6) * 7))) % 7;
它计算本月过去的整整一周(7天)的天数:例如,今天是本月的第11天,因此这整整一周(11/6=1.6…)已经过去了。一周有7天

接下来,它计算本月过去的天数与之前计算的天数之间的差异。11 - 7 = 4. 如果一个月的第一天是星期天,那么今天就是星期四(从星期一开始的7天加上4天)。为了得到正确的星期日,需要转换正确的日期(使用当前星期日的数字):7-4=3(这是7,因为这是自周日以来的第7天;3代表周三)

$today = getdate();
$firstWeekdayOfTheMonth = (($today['wday'] + 1) - ($today['mday'] - ((int)($today['mday'] / 6) * 7))) % 7;