Predefinição Discussão:Móvel

Sintaxe editar

Parâmetros necessários editar

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

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

Primeira semana do mês editar

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

A generalização às outras semanas do mês consiste em adicionar 7×{{{3}}}-7 ao resultado anterior.

5ª semana do mês editar

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

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

  • 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).

Regressar à página "Móvel".