con un clic
add-subdivision
Add subdivision holiday configurations based on ISO 3166-2 codes
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Add subdivision holiday configurations based on ISO 3166-2 codes
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Write country-specific holiday tests using CalendarCheckerApi
Create XML holiday calendar configuration files for a new country or region
Add country description properties for localization
Add holiday description properties for localization
Register a new holiday calendar in the HolidayCalendar enum
Basado en la clasificación ocupacional SOC
| name | Add Subdivision |
| description | Add subdivision holiday configurations based on ISO 3166-2 codes |
This guide explains how to add subdivision holiday configurations for subdivisions (states, provinces, regions) based on ISO 3166-2 codes.
Subdivisions allow you to define holidays that are specific to certain subdivision within a country. For example, in Germany, Bavaria (BY) has different holidays than Berlin (BE).
Edit the country's XML file: jollyday-core/src/main/resources/holidays/Holidays_[country_code].xml
Important: The
[country_code]must be lowercase (e.g.,Holidays_de.xmlfor Germany,Holidays_us.xmlfor United States).
Subdivision codes follow the ISO 3166-2 standard:
| Format | Example | Meaning |
|---|---|---|
XX-YY | DE-BY | Germany - Bavaria |
XX-YY-ZZ | DE-BY-MU | Germany - Bavaria - Munich |
The subdivision hierarchy attribute uses only the regional part (without the country prefix).
<SubConfigurations hierarchy="[subdivision_code]" description="[Subdivision Name]">
<Holidays>
<!-- Subdivision-specific holidays go here -->
</Holidays>
</SubConfigurations>
<SubConfigurations hierarchy="bw" description="Baden-Württemberg">
<Holidays>
<Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
<Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
<ChristianHoliday type="CORPUS_CHRISTI"/>
</Holidays>
</SubConfigurations>
Look up the subdivision code:
| Country | Source |
|---|---|
| Germany | https://en.wikipedia.org/wiki/ISO_3166-2:DE |
| United States | https://en.wikipedia.org/wiki/ISO_3166-2:US |
| France | https://en.wikipedia.org/wiki/ISO_3166-2:FR |
Example - Germany codes:
| Code | Region |
|---|---|
bw | Baden-Württemberg |
by | Bavaria |
be | Berlin |
bb | Brandenburg |
he | Hesse |
nw | North Rhine-Westphalia |
Insert the subdivision in your country's XML file:
<!-- Inside the root Configuration element, after <Holidays> and before closing </Configuration> -->
<SubConfigurations hierarchy="[subdivision_code]" description="[Subdivision Name]">
<Holidays>
<Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
</Holidays>
</SubConfigurations>
Document the source of subdivision holiday information:
<SubConfigurations hierarchy="[subdivision_code]" description="[Subdivision Name]">
<Holidays>
<Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
</Holidays>
<Sources>
<Source>https://www.region-official-website.gov/holidays</Source>
</Sources>
</SubConfigurations>
Subdivisions can be nested for more granular regions (cities within states):
<SubConfigurations hierarchy="by" description="Bavaria">
<Holidays>
<Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
</Holidays>
<!-- Munich - city within Bavaria -->
<SubConfigurations hierarchy="mu" description="Munich">
<Holidays>
<Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
</Holidays>
</SubConfigurations>
<!-- Augsburg - city within Bavaria -->
<SubConfigurations hierarchy="ag" description="Augsburg">
<Holidays>
<Fixed month="AUGUST" day="8" descriptionPropertiesKey="PEACE"/>
<Fixed month="AUGUST" day="15" descriptionPropertiesKey="ASSUMPTION_DAY"/>
</Holidays>
</SubConfigurations>
</SubConfigurations>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration hierarchy="de" description="Germany"
xmlns="https://focus_shift.de/jollyday/schema/holiday"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://focus_shift.de/jollyday/schema/holiday https://focus_shift.de/jollyday/schema/holiday/holiday.xsd">
<!-- National holidays apply to all Germany -->
<Holidays>
<Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
<Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
<Fixed month="DECEMBER" day="25" descriptionPropertiesKey="FIRST_CHRISTMAS_DAY"/>
<Fixed month="DECEMBER" day="26" descriptionPropertiesKey="SECOND_CHRISTMAS_DAY"/>
<ChristianHoliday type="GOOD_FRIDAY"/>
<ChristianHoliday type="EASTER_MONDAY"/>
<ChristianHoliday type="ASCENSION_DAY"/>
<ChristianHoliday type="WHIT_MONDAY"/>
</Holidays>
<Sources>
<Source>https://en.wikipedia.org/wiki/Public_holidays_in_Germany</Source>
<Source of="ISO 3166-2">https://en.wikipedia.org/wiki/ISO_3166-2:DE</Source>
</Sources>
<!-- Regional holidays for Bavaria only -->
<SubConfigurations hierarchy="by" description="Bavaria">
<Holidays>
<Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
<Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
<ChristianHoliday type="CORPUS_CHRISTI"/>
</Holidays>
</SubConfigurations>
<!-- Regional holidays for Berlin only -->
<SubConfigurations hierarchy="be" description="Berlin">
<Holidays>
<Fixed month="MARCH" day="8" descriptionPropertiesKey="INTERNATIONAL_WOMAN" validFrom="2019"/>
</Holidays>
</SubConfigurations>
</Configuration>
All holiday types can be used in subdivisions:
<SubConfigurations hierarchy="[subdivision_code]" description="[Subdivision Name]">
<Holidays>
<!-- Fixed date -->
<Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
<!-- Fixed weekday -->
<FixedWeekday which="FIRST" weekday="MONDAY" month="MAY" descriptionPropertiesKey="LABOUR_DAY"/>
<!-- Christian (Easter-based) -->
<ChristianHoliday type="CORPUS_CHRISTI"/>
<!-- Relative to fixed date -->
<RelativeToFixed descriptionPropertiesKey="REPENTANCE_PRAYER">
<Weekday>WEDNESDAY</Weekday>
<When>BEFORE</When>
<Date month="NOVEMBER" day="23"/>
</RelativeToFixed>
</Holidays>
</SubConfigurations>
Subdivision holidays can have validity periods:
<SubConfigurations hierarchy="[subdivision_code]" description="[Subdivision Name]">
<Holidays>
<!-- Only valid from 2019 onwards -->
<Fixed month="MARCH" day="8" descriptionPropertiesKey="INTERNATIONAL_WOMAN" validFrom="2019"/>
<!-- Only valid for specific year -->
<Fixed month="MAY" day="8" descriptionPropertiesKey="LIBERATION" validFrom="2020" validTo="2020"/>
<!-- Only valid in specific range -->
<Fixed month="OCTOBER" day="31" descriptionPropertiesKey="REFORMATION_DAY" validFrom="2018"/>
</Holidays>
</SubConfigurations>
Tests for subdivisions use the .inSubdivision() method chained after the holiday assertion:
import static de.focus_shift.jollyday.core.HolidayCalendar.GERMANY;
import static de.focus_shift.jollyday.tests.CalendarCheckerApi.assertFor;
import static java.time.Month.JANUARY;
@Test
void ensuresBavarianHolidays() {
assertFor(GERMANY)
.hasFixedHoliday("EPIPHANY", JANUARY, 6).inSubdivision("by").and()
.hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("by").and()
.hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("by")
.check();
}
@Test
void ensuresBadenWurttembergHolidays() {
assertFor(GERMANY)
.hasFixedHoliday("EPIPHANY", JANUARY, 6).inSubdivision("bw")
.check();
}
@Test
void ensuresNestedSubdivisions() {
// Munich is nested within Bavaria (by)
assertFor(GERMANY)
.hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("by", "mu")
.check();
}
@Test
void ensuresMultipleSubdivisions() {
// A holiday can be valid in multiple subdivisions
assertFor(GERMANY)
.hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("bw").and()
.hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("by").and()
.hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("nw")
.check();
}
Properties inSubdivision(final String... subdivisions)inSubdivision("by", "mu") for Munich in Bavaria)@Test
void ensuresAllHolidaysFor2024() {
assertFor(GERMANY)
// National holidays (all of Germany)
.hasFixedHoliday("NEW_YEAR", JANUARY, 1).and()
.hasFixedHoliday("LABOUR_DAY", MAY, 1).and()
.hasFixedHoliday("CHRISTMAS", DECEMBER, 25).and()
// Baden-Württemberg specific holidays
.hasFixedHoliday("EPIPHANY", JANUARY, 6).inSubdivision("bw").and()
.hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("bw").and()
.hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("bw").and()
// Bavaria specific holidays
.hasFixedHoliday("EPIPHANY", JANUARY, 6).inSubdivision("by").and()
.hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("by").and()
.hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("by").and()
// Munich (nested within Bavaria)
.hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("by", "mu")
.check();
}
description attribute<Sources> elements for subdivision holiday references<Holidays> sectionvalidFrom/validTo for historical accuracy<SubConfigurations hierarchy="CA" description="California">
<Holidays>
<Fixed month="JANUARY" day="1" descriptionPropertiesKey="NEW_YEAR"/>
<FixedWeekday which="THIRD" weekday="MONDAY" month="JANUARY" descriptionPropertiesKey="MLK_DAY"/>
</Holidays>
</SubConfigurations>
<SubConfigurations hierarchy="by" description="Bavaria">
<Holidays>
<Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
<Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
<ChristianHoliday type="CORPUS_CHRISTI"/>
</Holidays>
</SubConfigurations>
<SubConfigurations hierarchy="2C" description="Corsica">
<Holidays>
<Fixed month="MAY" day="15" descriptionPropertiesKey="CORSICA_LIBERATION"/>
</Holidays>
</SubConfigurations>
| Country | ISO Code | Subdivision Codes |
|---|---|---|
| Germany | DE | be, bb, bw, by, hb, he, hh, mv, ni, nw, rp, sl, sn, st, sh, th |
| United States | US | CA, NY, TX, FL, ... (state codes) |
| France | FR | 01, 02, ... (department codes) |
| Austria | AT | WI, B, K, ... (state codes) |