Executando verificaรงรฃo de seguranรงa...
3

๐Ÿ—“๏ธ [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! ๐Ÿค

Carregando publicaรงรฃo patrocinada...
2
1

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.

2

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.