Segue uma função em PHP para geração de calendários na forma de tabelas HTML. Ela permite habilitar ou desabilitar a exibição de dias extras (do mês anterior ou posterior que compartilham a mesma linha do calendário).
Linguagem: PHP
Copyright 2011 Rubens Takiguti Ribeiro
Licença: LGPL 3 ou superior
/**
* Gera um calendario na forma de tabela HTML
* @param int $mes Mes desejado (1 = Janeiro, 12 = Dezembro)
* @param int $ano Ano desejado
* @param bool $preencher_dias Preencher os dias extras com numeros ou nao
* @return string Calendario na forma de tabela HTML
*/
function gerar_calendario($mes, $ano, $preencher_dias = true) {
$time_primeiro_dia = mktime(0, 0, 0, $mes, 1, $ano);
$time_ultimo_dia = mktime(0, 0, 0, $mes + 1, 0, $ano);
$primeiro_dia_semana = (int)strftime('%u', $time_primeiro_dia);
$ultimo_dia = (int)strftime('%d', $time_ultimo_dia);
$ultimo_dia_semana = (int)strftime('%u', $time_ultimo_dia);
// Obter nome do mes
$nome_mes = strftime('%B', $time_primeiro_dia);
// Obter nomes dos dias da semana
for ($i = 1; $i <= 7; $i++) {
$time = mktime(0, 0, 0, $mes, $i - $primeiro_dia_semana, $ano);
$nome_dia[$i] = strftime('%A', $time);
$nome_abreviado_dia[$i] = strftime('%a', $time);
}
// Determinar dias a serem exibidos
$dias = array();
if ($primeiro_dia_semana != 7) {
$time_ultimo_dia_mes_passado = mktime(0, 0, 0, $mes, 0, $ano);
$ultimo_dia_mes_passado = (int)strftime('%d', $time_ultimo_dia_mes_passado);
for ($i = $primeiro_dia_semana - 1; $i >= 0; $i--) {
$dias[] = $preencher_dias ? $ultimo_dia_mes_passado - $i : '';
}
}
$posicao_antes = count($dias);;
for ($i = 1; $i <= $ultimo_dia; $i++) {
$dias[] = $i;
}
$posicao_depois = count($dias);
if ($ultimo_dia_semana < 6) {
$max = 7 - $ultimo_dia_semana;
for ($i = 1; $i < $max; $i++) {
$dias[] = $preencher_dias ? $i : '';
}
} elseif ($ultimo_dia_semana == 7) {
for ($i = 1; $i <= 6; $i++) {
$dias[] = $preencher_dias ? $i : '';
}
}
$tabela = <<<HTML
<table class="calendario">
<caption>{$nome_mes}/{$ano}</caption>
<thead>
<tr>
<th scope="col"><abbr title="{$nome_dia[1]}">{$nome_abreviado_dia[1]}</abbr></th>
<th scope="col"><abbr title="{$nome_dia[2]}">{$nome_abreviado_dia[2]}</abbr></th>
<th scope="col"><abbr title="{$nome_dia[3]}">{$nome_abreviado_dia[3]}</abbr></th>
<th scope="col"><abbr title="{$nome_dia[4]}">{$nome_abreviado_dia[4]}</abbr></th>
<th scope="col"><abbr title="{$nome_dia[5]}">{$nome_abreviado_dia[5]}</abbr></th>
<th scope="col"><abbr title="{$nome_dia[6]}">{$nome_abreviado_dia[6]}</abbr></th>
<th scope="col"><abbr title="{$nome_dia[7]}">{$nome_abreviado_dia[7]}</abbr></th>
</tr>
</thead>
<tbody>
HTML;
$coluna = 1;
foreach ($dias as $i => $dia) {
if ($coluna == 1) {
$tabela .= '<tr>';
}
$class = $i < $posicao_antes || $i >= $posicao_depois ? ' class="extra"' : '';
$tabela .= '<td'.$class.'>'.$dia.'</td>';
$coluna += 1;
if ($coluna == 8) {
$tabela .= '</tr>';
$coluna = 1;
}
}
$tabela .= <<<HTML
</tbody>
</table>
HTML;
return $tabela;
}
Exemplo de uso:
setlocale(LC_TIME, 'pt_BR.UTF-8'); echo gerar_calendario(3, 2011);
Observe que ela é sensível à localidade, ou seja, os nomes dos meses e dos dias da semana são determinados com a localidade especificada pela função setlocale.
6 comentários
Não consegui executar o código. Que deve ser feito?
É só chamar a função colocando as linhas abaixo onde você quer que o calendário apareça:
$time = time();
$mes = (int)strftime('%m', $time);
$ano = (int)strftime('%Y', $time);
setlocale(LC_TIME, 'pt_BR.UTF-8');
echo gerar_calendario($mes, $ano, true);
Ficou estranho o codigo
August/2012
Wed Thu Fri Sat Sun Mon Tue
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6
nao começa numa determinada semana e passa para o mes seguinte na exibição
$mes = date('n')-1;// ou $mes = date('n');
$ano = date('Y');
echo gerar_calendario($mes, $ano);
sei que peguei o codigo pronto
mais nao serviu para o que eu queria
Olá, Anônimo
Aqui no meu computador a função retornou corretamente. Acredito que no seu, ocorreu algum problema na detecção do dia da semana e por isso ficou assim.
Se puder, faça um teste para ver o que o código abaixo exibe:
$time = mktime(0, 0, 0, 8, 1, 2012);
$dia_semana = strftime('%u', $time);
var_dump($dia_semana);
O correto é exibir:
string(1) "3"
Você é o cara! Muito bom! Parabéns!
Muito bom.. Me ajudou a fugir do javascript.
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com