πŸ—“οΈ [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.

`getpaulo` entΓ£o datas parecem algo simples um dia, um mes, uma ano, uma hora, um minuto e um segundo, coisa simple. Mas o loco comeΓ§a quando vimos que para armasenar uma data usamos Unix Timestamp que "aleatoriamente" comeΓ§a em 1970, e de um de segundos de um dia qualquer que definimos as datas. Depois que conseguimos construir a data a partir dos segundos temos que usar ela de alguma maneira, ai pensa queremos pegar todas os posts de um determinado dia. O que fazer? `data-do-post = 01/01/1970`? NΓ£o o correto Γ© fazer `data-do-post >= 1970-01-01T00:00:00 AND data-do-post < 1970-01-02T00:00:00`. Agora vamos comparar datas. quantos dias tem de direfeca entre `31/01/1970` e `01/03/1970`? Acertou quem disse 29!!!πŸŽ‰ Mas quantos meses 1, 2, 3???? 🀨 E mais uma coisa eu sempre apanho dos encodings, saio testantos as converçáes atΓ© alguma coisa funciona.