ποΈ [DESAFIO] Criando um calendΓ‘rio a partir de um N ano com fΓ³rmulas matemΓ‘ticas.
CalendΓ‘rio por ano
Este é um projeto | desafio que inicie em inspiração a uma publicação no facebook.
https://www.facebook.com/groups/osadpa/permalink/1565130443592477
ReferΓͺncias
Usei como referΓͺncia o cΓ‘lculo para saber qual Γ© o dia da semana cai qualquer dia, cΓ‘lculo descrito no vΓdeo do Prof. Rafael Procopio do canal MatemΓ‘tica Rio com Prof. Rafael Procopio.
Video: https://www.youtube.com/watch?v=u7NAy_kDZ3A
E usei também o cÑlculo do ano bissexto descrito no wikipedia, uma explicação bem detalhada e com exemplos de código.
Pagina: https://pt.wikipedia.org/wiki/Ano_bissexto
CΓ‘lculos
Dia da semana de qualquer dia da histΓ³ria.
$d = 6; //dia
$m = 7; //mes
$a = 1990; //ano
$k = (($d + (2 * $m) + floor((3 * ($m + 1)) / 5) + ($a + floor($a / 4) - floor($a / 100) + floor($a / 400) + 2)) % 7);
Temos tambΓ©m de considerar a possibilidade de anos bissexto, para tanto o Prof. Rafael Procopio pede para considerarmos Janeiro e Fevereiro como pertencentes ao ano anterior mas como memes 13 e 14 respectivamente.
$dia = 6; //dia
$mes = 7; //mes
$ano = 1990; //ano
$d = $dia; //dia
$m = (($mes <= 2)? $mes + 12: $mes); //mes
$a = (($mes <= 2)? $ano - 1: $ano); //ano
$k = (($d + (2 * $m) + floor((3 * ($m + 1)) / 5) + ($a + floor($a / 4) - floor($a / 100) + floor($a / 400) + 2)) % 7);
Calculando $k
como descrito no vΓdeo do Prof. Rafael Procopio, e seu resultado Γ© definido usando o seguinte array descrito pelo Porf.
$semanaResultado = [
0 => 'Sabado',
1 => 'Domingo',
2 => 'Segunda',
3 => 'Terça',
4 => 'Quarta',
5 => 'Quinta',
6 => 'Sexta',
];
Entretanto nos cΓ³digos o dia inicial da semana nΓ£o Γ© sΓ‘bado, mas sim domingo, para tanto usei um array para converter o resultado da fΓ³rmula para o resultado esperado, array:
$resultadoEsperado = [
0 => 6,
1 => 0,
2 => 1,
3 => 2,
4 => 3,
5 => 4,
6 => 5,
];
Com $resultadoEsperado
eu obtia o resultado tendo como Domingo sendo o dia 0 da semana.
Calculo do ano bissexto
$ano = 1990; //ano
$bissexto = (($ano % 400 == 0) || (($ano % 4 == 0) && ($ano % 100 != 0)));
Esse cΓ‘lculo Γ© bem simples e segue uma um algoritmo bem interessante.
- Todo ano divisΓvel por 4 Γ© bissexto.
- Todo ano divisΓvel por 100 nΓ£o Γ© bissexto.
- Todo ano divisΓvel por 400 Γ© bissexto.
OBS.: As regras abaixo na lista vale mais que a de cima.
Essas regras concluem que o ano tem 365,2425 dias. Resolvido com a seguinte conta.
365 + (1 / 400) + (1 / 4) - (1 / 100) = 365,2425
Modo de uso
Para usar, Γ© preciso colocar o cΓ³digo em um servidor web que use php. depois acessar diretamente o arquivo como:
localhost/calendario-por-ano.php
O script toma como padrΓ£o o ano atual para gerar o calendΓ‘rio. Para que ver o calendΓ‘rio de outros anos basta acrescentar uma query na url da seguinte maneira:
localhost/calendario-por-ano.php?ano=1990
ano
serΓ‘ o ano que vc quer ver o calendΓ‘rio.
Resultado
O resultado sairΓ‘ como no exemplo a seguir:
1990
ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ
β Janeiro β β Fevereiro β β Marco β β Abril β
β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£
β D S T Q Q S Sβ β D S T Q Q S Sβ β D S T Q Q S Sβ β D S T Q Q S Sβ
β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£
β 1 2 3 4 5 6β β 1 2 3β β 1 2 3β β 1 2 3 4 5 6 7β
β 7 8 9 10 11 12 13β β 4 5 6 7 8 9 10β β 4 5 6 7 8 9 10β β 8 9 10 11 12 13 14β
β14 15 16 17 18 19 20β β11 12 13 14 15 16 17β β11 12 13 14 15 16 17β β15 16 17 18 19 20 21β
β21 22 23 24 25 26 27β β18 19 20 21 22 23 24β β18 19 20 21 22 23 24β β22 23 24 25 26 27 28β
β28 29 30 31 β β25 26 27 28 β β25 26 27 28 29 30 31β β29 30 β
β β β β β β β β
ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ
ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ
β Maio β β Junho β β Julho β β Agosto β
β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£
β D S T Q Q S Sβ β D S T Q Q S Sβ β D S T Q Q S Sβ β D S T Q Q S Sβ
β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£
β 1 2 3 4 5β β 1 2β β 1 2 3 4 5 6 7β β 1 2 3 4β
β 6 7 8 9 10 11 12β β 3 4 5 6 7 8 9β β 8 9 10 11 12 13 14β β 5 6 7 8 9 10 11β
β13 14 15 16 17 18 19β β10 11 12 13 14 15 16β β15 16 17 18 19 20 21β β12 13 14 15 16 17 18β
β20 21 22 23 24 25 26β β17 18 19 20 21 22 23β β22 23 24 25 26 27 28β β19 20 21 22 23 24 25β
β27 28 29 30 31 β β24 25 26 27 28 29 30β β29 30 31 β β26 27 28 29 30 31 β
β β β β β β β β
ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ
ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ
β Setembro β β Outubro β β Novembro β β Dezembro β
β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£
β D S T Q Q S Sβ β D S T Q Q S Sβ β D S T Q Q S Sβ β D S T Q Q S Sβ
β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£ β βββββββββββββββββββββ£
β 1β β 1 2 3 4 5 6β β 1 2 3β β 1β
β 2 3 4 5 6 7 8β β 7 8 9 10 11 12 13β β 4 5 6 7 8 9 10β β 2 3 4 5 6 7 8β
β 9 10 11 12 13 14 15β β14 15 16 17 18 19 20β β11 12 13 14 15 16 17β β 9 10 11 12 13 14 15β
β16 17 18 19 20 21 22β β21 22 23 24 25 26 27β β18 19 20 21 22 23 24β β16 17 18 19 20 21 22β
β23 24 25 26 27 28 29β β28 29 30 31 β β25 26 27 28 29 30 β β23 24 25 26 27 28 29β
β30 β β β β β β30 31 β
ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ
OBS.: Março aparece sem "ç" pôs bugava o layout.
Agradecimentos
Agradecimentos ao Cristian Mota por ter crido o post que me incentivou a criar este cΓ³digo, agradecimentos ao Prof. Rafael Procopio por seu vΓdeo explicando a fΓ³rmula, e agradecimentos a wikipΓ©dia e seus colaboradores com sua explicação super satisfatΓ³ria sobre o ano bissexto.
A cima coloque o README.md de um "desafio" que me auto coloque enquanto estava navegando pelo Facebook.
Nele me coloque algumas restriçáes:
- Não usaria funçáes de data da linguagem;
- Faria as foramulas para calular o que precisava;
- Sua saida tinha de ser um texto corrido;
Com isso em mente consegui obter o resultado deste progeto: rodrigo-dechen/calendario-por-ano
Alguem mais ja se sentio desafiado com algo que alguem tenha postado? Comenta ai! π€
EU CRIEI UM SITE DE UPLOAD DE IMAGENS KKS
Lendo seu artigo estou aqui pensando porque lidar com datas é uma das coisas mais problemÑticas da programação. Algo que todo programador deveria saber lidar, mas não é bem assim na prÑtica. Outra coisa que sinto que muitos não entendem é sobre como lidar com strings e diferentes encodings.
ParabΓ©ns pelo projeto, me motivou aqui a retomar algumas coisas que estΓ£o na minha lista, espero postar em breve aqui no tabnews.