M · UDF
fnHolidaysInPeriodFR
Feriados da França entre duas datas.
Categoria: Data e horaTipo: UDFVersão: v2.0Fonte: Paulo André Jesus — OfficeTuningAtualizado em: 25/09/2026
Documentação completa na Function Library →Sintaxe
fnHolidaysInPeriodFR(StartDate as date, EndDate as date, optional AlsaceMoselle as nullable logical) as tableArgumentos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| StartDate | date | Sim | Início do período. |
| EndDate | date | Sim | Fim do período, inclusive. |
| AlsaceMoselle | nullable logical | Não | true inclui Vendredi saint e Saint-Étienne (26/12). |
Retorno
table [DateReference = date, HolidayFR = text]
Código completo
let
fnHolidaysInPeriodFR = (StartDate as date, EndDate as date, optional AlsaceMoselle as nullable logical) as table =>
let
fnAno = (y as number) as list =>
let
// Domingo de Páscoa: algoritmo gregoriano anônimo (Meeus/Jones/Butcher)
a = Number.Mod(y, 19),
b = Number.IntegerDivide(y, 100),
c = Number.Mod(y, 100),
d = Number.IntegerDivide(b, 4),
e = Number.Mod(b, 4),
f = Number.IntegerDivide(b + 8, 25),
g = Number.IntegerDivide(b - f + 1, 3),
h = Number.Mod(19 * a + b - d - g + 15, 30),
i = Number.IntegerDivide(c, 4),
k = Number.Mod(c, 4),
l = Number.Mod(32 + 2 * e + 2 * i - h - k, 7),
m = Number.IntegerDivide(a + 11 * h + 22 * l, 451),
vPaques = #date(y, Number.IntegerDivide(h + l - 7 * m + 114, 31), Number.Mod(h + l - 7 * m + 114, 31) + 1)
in
{
{#date(y, 1, 1), "Jour de l'An"},
{Date.AddDays(vPaques, 1), "Lundi de Pâques"},
{#date(y, 5, 1), "Fête du Travail"},
{#date(y, 5, 8), "Victoire 1945"},
{Date.AddDays(vPaques, 39), "Ascension"},
{Date.AddDays(vPaques, 50), "Lundi de Pentecôte"},
{#date(y, 7, 14), "Fête Nationale"},
{#date(y, 8, 15), "Assomption"},
{#date(y, 11, 1), "Toussaint"},
{#date(y, 11, 11), "Armistice 1918"},
{#date(y, 12, 25), "Noël"}
}
& (if AlsaceMoselle = true
then {{Date.AddDays(vPaques, -2), "Vendredi saint"}, {#date(y, 12, 26), "Saint-Étienne"}}
else {}),
vAnos = if EndDate < StartDate then {} else {Date.Year(StartDate) .. Date.Year(EndDate)},
vTabela = #table(type table [DateReference = date, HolidayFR = text], List.Combine(List.Transform(vAnos, fnAno))),
vPeriodo = Table.SelectRows(vTabela, each [DateReference] >= StartDate and [DateReference] <= EndDate)
in
Table.Sort(vPeriodo, {{"DateReference", Order.Ascending}}),
Documentacao = [
Documentation.Name = "fnHolidaysInPeriodFR",
Documentation.Description = "Feriados da França entre duas datas.",
Documentation.LongDescription = "Os 11 feriados do Code du travail (art. L3133-1); móveis calculados a partir da Páscoa. Com AlsaceMoselle = true, inclui Vendredi saint e Saint-Étienne. Colunas DateReference e HolidayFR.",
Documentation.Category = "Data e hora",
Documentation.Author = "Paulo André Jesus",
Documentation.Version = "2.0",
Documentation.Examples = {
[Description = "2026", Code = "fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31))",
Result = "11 linhas; Lundi de Pâques 06/04, Ascension 14/05, Lundi de Pentecôte 25/05"],
[Description = "Alsácia-Mosela", Code = "fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31), true)", Result = "13 linhas"]
}
]
in
Value.ReplaceType(fnHolidaysInPeriodFR, Value.ReplaceMetadata(Value.Type(fnHolidaysInPeriodFR), Documentacao))Exemplos
fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31))
// 11 linhas; Lundi de Pâques 06/04, Ascension 14/05, Lundi de Pentecôte 25/05
fnHolidaysInPeriodFR(#date(2026, 1, 1), #date(2026, 12, 31), true)
// 13 linhasDicas e observações
💡 Os 11 feriados do Code du travail, art. L3133-1. ⚠️ A Lundi de Pentecôte costuma ser a journée de solidarité (dia trabalhado). Confirme a regra do cliente antes de tirá-la dos dias úteis. ⚠️ A Ascension pode cair em 01/05 ou 08/05 (01/05/2008): agrupe por data antes de mesclar com o calendário.