Predefinição Discussão:Móvel
Adicionar tópicoSintaxe
[editar código-fonte]Parâmetros necessários
[editar código-fonte]1: ano
2: mês
3: número de ordem (primeiro, segundo, etc). Para o último do mês usar 0; para o quinto do mês, com mensagem de erro caso não exista, usar 100
4: dia da semana especificado (seg=2, ter=3,..., sab=7, dom=1)
5: dia a partir do qual a contagem é feita (facultativo)
n = parâmetro livre: n dias depois de um determinado dia
d = parâmetro livre: o dia da semana seguinte ao um determinado domingo (segunda-feira=2,...). Equivalente a n-1
ano=1: inclui o ano (facultativo)
Exemplos
[editar código-fonte]O mês de setembro de 2020 é mostrado ao lado para comparação (não faz parte da predefinição)
setembro | |||||||
sem | S | T | Q | Q | S | S | D |
36 | 1 | 2 | 3 | 4 | 5 | 6 | |
37 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
38 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
39 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
40 | 28 | 29 | 30 |
- {{móvel|2020|9|1|3|ano=1}} ano 2020, 9º mês, primeira terça-feira: 1 de setembro de 2020
- {{móvel|2020|9|0|1}} ano 2020, 9º mês, último domingo: 27 de setembro
- {{móvel|2020|9|1|2|13}} ano 2020, 9º mês, primeira segunda-feira depois do dia 13: 14 de setembro
- {{móvel|d=2|2020|9|1|1}} segunda-feira depois de ano 2020, 9º mês, primeiro domingo: 7 de setembro
- {{móvel|n=2|2020|9|1|2}} dois dias depois de ano 2020, 9º mês, primeira segunda-feira: 9 de setembro
- {{móvel|2020|9|5|4}} ano 2020, 9º mês, quinta quarta-feira: 30 de setembro
- {{móvel|2020|9|5|5}} ano 2020, 9º mês, quinta quinta-feira: 1 de outubro
- {{móvel|2020|9|100|4}} ano 2020, 9º mês, quinta quarta-feira, sem mudança de mês: 30 de setembro
- {{móvel|2020|9|100|5}} ano 2020, 9º mês, quinta quinta-feira, sem mudança de mês: Não existe neste mês
Algortimo
[editar código-fonte]Primeira semana do mês
[editar código-fonte]O algoritmo usado consiste na determinação do dia da semana do dia da partida ("dia zero") e adição de um número calculado pelo algoritmo, obtendo-se o "dia alvo"
- j \d\e F corresponde ao formato de representação da data
O modo de representar os dias da semana nesta predefinição é mais adequados ao mundo lusófono, onde a etiqueta 2 corresponde à 2ª-feira, 3ª à terça, etc, mas a representação para a função #time 0 representa o domingo, 1 representa a segunda-feira etc...
A expressão
{{#time:w|{{{1}}}-{{{2}}}-{{{5|0}}}} (representada como A abaixo)
devolve a etiqueta (w) correspondente ao dia da semana (w(domingo)=0) do dia zero, fornecido pelo parâmetro {{{5}}}, que tem o valor por defeito de 0 correspondente ao último dia do mês anterior.
Se as etiquetas fossem equivalentes, para saber a data correspondente a um determinado dia da semana bastaria subtrair a etiqueta do dia da semana pretendido à etiqueta correspondente ao dia de partida. Exemplo: Se o dia zero for uma terça-feira (w=2) e se pretende saber qual a quinta-feira seguinte (w=4) basta fazer:
- 4-2=3→ O dia 2 é a quinta feira seguinte.
Generalizando, seria em pseudocódigo:
- {{{4}}}-A
O cálculo anterior pode dar números negativos. Por isso, deve adicionar-se 7 para que o resultado dê um resultado depois do dia zero. Para evitar números maiores do que 7 (logo, na semana errada) usa-se a função mod7:
- ({{{4}}}+7-A)mod7
Como há uma desfasagem entre as etiquetas de {{Móvel}} (2→segunda) e #time(2→terça) é necessário subtrair 1 ao argumento da função mod7:
- ({{{4}}}+6-A)mod7
Deste modo, a função mod7 dá resultados de 1 a 6 corretos, mas continua a dar 0, quando o resultado pretendido é suposto ser 7. A situação resolve-se por subtrair 1 ao argumento da função e recolocá-lo fora da função, obtendo-se a expressão final para a primeira semana do mês:
- ({{{4}}}+5-{{#time:w|{{{1}}}-{{{2}}}-{{{5|0}}}}})mod7+1
Outras semanas do mês
[editar código-fonte]A generalização às outras semanas do mês consiste em adicionar 7×{{{3}}}-7 ao resultado anterior.
5ª semana do mês
[editar código-fonte]Duas situações podem acontecer quando nos referimos, por exemplo, ao quinto domingo do mês:
- Não importa que esse dia calhe no mês seguinte, com a data festiva a realizar-se sempre. Neste caso, o algoritmo já descrito não apresenta problemas, sendo usado o valor de 5 para o parâmetro {{{3}}}
- A data festiva só se realiza, se o quinto domingo existir de facto. Para tal, o algoritmo precisa de decidir se o dia alvo é de facto o quinto domingo do mês, caso contrário a data festiva não existe. Neste caso, é usado o valor de 100 para o parâmetro {{{3}}}. Assim, algoritmo determina a data do dia alvo e compara-a com o número de dias do mês ({{#time: t|{{{1}}}-{{{2}}}-1 }} (o parâmetro t devolve o número de dias do mês em questão.) Se o valor for superior, o algoritmo devolve o resultado: Não existe neste mês.
Última semana do mês
[editar código-fonte]Uma data festiva que se realize, por exemplo, no último domingo do mês, não pode ser determinada com algoritmo descrito até agora, porque este não é capaz de decidir se o último domingo é o quarto ou o quinto domingo do mês. Neste caso, é usado o valor de 0 para o parâmetro {{{3}}}. Como no caso anterior, o algoritmo determina o quinto domingo do mês e compara-o com o número de dias do mês. Se o valor for inferior, esse é o dia alvo. Caso contrário, dever-se-á subtrair 7 ao valor obtido, para passar para a semana anterior.
Outros casos
[editar código-fonte]- Por vezes, a definição da data de uma celebreação não se baseia na 1ª ou 2ª terça-feira do mês, mas na segunda-feira seguinte ao dia 3, por exemplo. Para tal, basta inserir o valor do dia zero no parâmetro facultativo {{{5}}}.
- Para preceitos mais complexos, como terça-feira a seguir ao primeiro domingo, os parâmetros {{{d}}} ou {{{n}}} devem ser utilizados.
No exemplo dado determina-se o primeiro domingo do mês e depois altera-se o resultado, de modo a obter o dia alvo desejado. O parâmetro {{{d}}} corresponde à etiqueta do dia da semana (como 2→segunda-feira), usando o domingo como partida (só funciona neste caso). O parâmetro {{{n}}} é o número de dias que é necessário adicionar, onde a quinta-feira seguinte a uma determinada terça-feira corresponde ao valor {{{n}}}=2 (dois dias depois).