Календарь на языке PHP

у меня есть календарь в php, и я просто хочу знать две простые вещи!

Как сделать так, чтобы календарь начинался не в воскресенье? (Например, день 1 = понедельник).

А как сделать так, чтобы все воскресенья отображались красным цветом?

Спасибо, и вот код:

<!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>

0

Решение

Вот мое решение:

<!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>

Используя strtotime и date, вы можете получить день недели первого дня месяца следующим образом:

$firstWeekdayOfTheMonth = date('w', strtotime('first day of this month'));

Решение, которое я представляю, использует арифметическое вычисление, чтобы найти первый день недели месяца, зная текущий месяц и дни недели:

$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 (это семерка, потому что это седьмой день с воскресенья; 3 представляет среду) ,

0

Другие решения

Функция date () предлагает многое для сравнения дня недели. Очевидно, что вы должны сообщить PHP, что такое день обращения, чтобы PHP знал, какие это дни.

В вашем примере вы можете установить временную метку и использовать дату (‘N’, $ current_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>");

?>
0

По вопросам рекламы [email protected]