+
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1649,7 +1649,7 @@ any) in brackets, available languages and additional holiday categories. All cou
<td>Switzerland</td>
<td>CH</td>
<td>Cantons: AG (Aargau), AI (Appenzell Innerrhoden), AR (Appenzell Ausserrhoden), BE (Bern, Berne), BL (Basel-Landschaft), BS (Basel-Stadt), FR (Freiburg, Fribourg), GE (Genève), GL (Glarus), GR (Graubünden, Grigioni, Grischun), JU (Jura), LU (Luzern), NE (Neuchâtel), NW (Nidwalden), OW (Obwalden), SG (Sankt Gallen), SH (Schaffhausen), SO (Solothurn), SZ (Schwyz), TG (Thurgau), TI (Ticino), UR (Uri), VD (Vaud), VS (Valais, Wallis), ZG (Zug), ZH (Zürich)</td>
<td><strong>de</strong>, en_US, fr, it, uk</td>
<td><strong>de</strong>, en_US, fr, it, th, uk</td>
<td>HALF_DAY, OPTIONAL</td>
</tr>
<tr>
Expand Down
89 changes: 86 additions & 3 deletions holidays/countries/switzerland.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,29 @@

from gettext import gettext as tr

from holidays.calendars.gregorian import APR, THU, _timedelta, _get_nth_weekday_of_month
from holidays.calendars.gregorian import MAR, APR, MON, THU, _timedelta, _get_nth_weekday_of_month
from holidays.constants import HALF_DAY, OPTIONAL, PUBLIC
from holidays.groups import ChristianHolidays, InternationalHolidays
from holidays.observed_holiday_base import ObservedHolidayBase, MON_ONLY, TUE_TO_NONE, SAT_TO_NONE
from holidays.observed_holiday_base import (
ObservedHolidayBase,
MON_ONLY,
TUE_TO_NONE,
SAT_TO_NONE,
SUN_TO_NONE,
ALL_TO_NEXT_MON,
)


class Switzerland(ObservedHolidayBase, ChristianHolidays, InternationalHolidays):
"""Switzerland holidays.

References:
* <https://web.archive.org/web/20250201054902/https://www.bj.admin.ch/dam/bj/de/data/publiservice/service/zivilprozessrecht/kant-feiertage.pdf>
* <https://web.archive.org/web/20251002085718/https://www.zuerich.com/en/inform-plan/useful-information-and-services/opening-hours-and-public-holidays/feiertage>
* <https://web.archive.org/web/20251008032850/https://www.stadt-zuerich.ch/de/politik-und-verwaltung/arbeiten-bei-der-stadt/gut-zu-wissen/ferien-urlaub/feiertage-betriebsferientage-bft.html>
* <https://web.archive.org/web/20230423124030/https://zuercher-bankenverband.ch/zbv/assets/uploads/2021/09/2022-Feiertagsuebersicht.pdf>
* <https://web.archive.org/web/20251008045946/https://zuercher-bankenverband.ch/zbv/assets/uploads/2022/09/2023-Feiertagsuebersicht.pdf>
* <https://web.archive.org/web/20251003094601/https://www.timeanddate.com/calendar/seasons.html?year=1900&n=268>
* <https://de.wikipedia.org/wiki/Feiertage_in_der_Schweiz>
* <https://en.wikipedia.org/wiki/Public_holidays_in_Switzerland>
"""
Expand Down Expand Up @@ -92,7 +104,7 @@ class Switzerland(ObservedHolidayBase, ChristianHolidays, InternationalHolidays)
"Zürich": "ZH",
}
supported_categories = (HALF_DAY, OPTIONAL, PUBLIC)
supported_languages = ("de", "en_US", "fr", "it", "uk")
supported_languages = ("de", "en_US", "fr", "it", "th", "uk")

def __init__(self, *args, **kwargs):
ChristianHolidays.__init__(self)
Expand Down Expand Up @@ -713,9 +725,80 @@ def _populate_subdiv_zh_public_holidays(self):
# Whit Monday.
self._add_whit_monday(tr("Pfingstmontag"))

if self._year >= 1899:
# Knabenschiessen.
name = tr("Knabenschiessen")
self._add_holiday_2nd_sun_of_sep(name)
self._add_holiday_1_day_prior_2nd_sun_of_sep(name)

# Saint Stephen's Day.
self._add_christmas_day_two(tr("Stephanstag"))

def _populate_subdiv_zh_common(self):
"""Populate list of holidays observed by both `HALF_DAY` and `OPTIONAL` categories."""
# Day before Good Friday.
self._add_holy_thursday(tr("Vortag vor Karfreitag"))

if self._year >= 1902:
# Sechseläuten.
name = tr("Sechseläuten")
# Third Monday in April but not in Holy Week.
if self._year >= 1952:
dt = _get_nth_weekday_of_month(3, MON, APR, self._year)
self._add_holiday(
name, _timedelta(dt, +7) if dt == _timedelta(self._easter_sunday, +1) else dt
)
# From 1902-1951 this was the First Monday following the Vernal Equinox.
else:
self._move_holiday_forced(
self._add_holiday(name, self._vernal_equinox_date), rule=ALL_TO_NEXT_MON
)

# Christmas Eve.
self._add_christmas_eve(tr("Heiligabend"))

# New Year's Eve.
self._add_new_years_eve(tr("Vortag vor Neujahr"))

def _populate_subdiv_zh_half_day_holidays(self):
self._populate_subdiv_zh_common()

if self._year >= 1899:
# Knabenschiessen.
self._add_holiday_1_day_past_2nd_sun_of_sep(tr("Knabenschiessen"))

# Day before Ascension Day.
self._add_holiday_38_days_past_easter(tr("Vortag vor Auffahrt"))

def _populate_subdiv_zh_optional_holidays(self):
self._populate_subdiv_zh_common()

dec_25 = self._christmas_day

# This is only granted if end-year bridge holidays <= 2.
if self._is_tuesday(dec_25) or self._is_wednesday(dec_25) or self._is_thursday(dec_25):
# Bridge Holiday for Ascension Day.
self._add_holiday_40_days_past_easter(tr("Brückentag nach Auffahrt"))

# This is only granted if end-year bridge holidays <= 3.
if self._year >= 1899 and not self._is_weekend(dec_25):
# Knabenschiessen.
self._add_holiday_1_day_past_2nd_sun_of_sep(tr("Knabenschiessen"))

# Bridge Holiday.
name = tr("Brückentag")
self._add_observed(self._add_holiday_dec_27(name), rule=SAT_TO_NONE + SUN_TO_NONE)
self._add_observed(self._add_holiday_dec_28(name), rule=SAT_TO_NONE + SUN_TO_NONE)
self._add_observed(self._add_holiday_dec_29(name), rule=SAT_TO_NONE + SUN_TO_NONE)
self._add_observed(self._add_holiday_dec_30(name), rule=SAT_TO_NONE + SUN_TO_NONE)

@property
def _vernal_equinox_date(self) -> tuple[int, int]:
"""Return the Vernal Equinox date for Zurich (1902-1951)."""
return MAR, 20 if (
(self._year >= 1916 and self._year % 4 == 0) or self._year == 1949
) else 21


class CH(Switzerland):
pass
Expand Down
41 changes: 37 additions & 4 deletions holidays/locale/de/LC_MESSAGES/CH.po
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,20 @@
# License: MIT (see LICENSE file)
#
# Switzerland holidays.
#
msgid ""
msgstr ""
"Project-Id-Version: Holidays 0.42\n"
"Project-Id-Version: Holidays 0.83\n"
"POT-Creation-Date: 2023-04-10 15:41+0300\n"
"PO-Revision-Date: 2024-01-21 14:46+0200\n"
"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
"PO-Revision-Date: 2025-10-08 13:09+0700\n"
"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
"Language-Team: Holidays Localization Team\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 3.4\n"
"X-Generator: Poedit 3.7\n"
"X-Source-Language: de\n"

#. New Year's Day.
Expand Down Expand Up @@ -121,3 +122,35 @@ msgstr ""
#. Prayer Monday.
msgid "Bettagsmontag"
msgstr ""

#. Knabenschiessen.
msgid "Knabenschiessen"
msgstr ""

#. Day before Good Friday.
msgid "Vortag vor Karfreitag"
msgstr ""

#. Sechseläuten.
msgid "Sechseläuten"
msgstr ""

#. Christmas Eve.
msgid "Heiligabend"
msgstr ""

#. New Year's Eve.
msgid "Vortag vor Neujahr"
msgstr ""

#. Day before Ascension Day.
msgid "Vortag vor Auffahrt"
msgstr ""

#. Bridge Holiday for Ascension Day.
msgid "Brückentag nach Auffahrt"
msgstr ""

#. Bridge Holiday.
msgid "Brückentag"
msgstr ""
40 changes: 36 additions & 4 deletions holidays/locale/en_US/LC_MESSAGES/CH.po
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Holidays 0.56\n"
"Project-Id-Version: Holidays 0.83\n"
"POT-Creation-Date: 2023-04-10 15:41+0300\n"
"PO-Revision-Date: 2024-08-31 18:20+0300\n"
"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
"PO-Revision-Date: 2025-10-08 13:09+0700\n"
"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
"Language-Team: Holidays Localization Team\n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 3.4\n"
"X-Generator: Poedit 3.7\n"
"X-Source-Language: de\n"

#. New Year's Day.
Expand Down Expand Up @@ -122,3 +122,35 @@ msgstr "Saints Peter and Paul"
#. Prayer Monday.
msgid "Bettagsmontag"
msgstr "Prayer Monday"

#. Knabenschiessen.
msgid "Knabenschiessen"
msgstr "Knabenschiessen"

#. Day before Good Friday.
msgid "Vortag vor Karfreitag"
msgstr "Day before Good Friday"

#. Sechseläuten.
msgid "Sechseläuten"
msgstr "Sechseläuten"

#. Christmas Eve.
msgid "Heiligabend"
msgstr "Christmas Eve"

#. New Year's Eve.
msgid "Vortag vor Neujahr"
msgstr "New Year's Eve"

#. Day before Ascension Day.
msgid "Vortag vor Auffahrt"
msgstr "Day before Ascension Day"

#. Bridge Holiday for Ascension Day.
msgid "Brückentag nach Auffahrt"
msgstr "Bridge Holiday for Ascension Day"

#. Bridge Holiday.
msgid "Brückentag"
msgstr "Bridge Holiday"
41 changes: 37 additions & 4 deletions holidays/locale/fr/LC_MESSAGES/CH.po
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,20 @@
# License: MIT (see LICENSE file)
#
# Switzerland holidays fr localization.
#
msgid ""
msgstr ""
"Project-Id-Version: Holidays 0.42\n"
"Project-Id-Version: Holidays 0.83\n"
"POT-Creation-Date: 2023-04-10 15:41+0300\n"
"PO-Revision-Date: 2024-01-21 14:48+0200\n"
"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
"PO-Revision-Date: 2025-10-08 13:09+0700\n"
"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
"Language-Team: Holidays Localization Team\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 3.4\n"
"X-Generator: Poedit 3.7\n"
"X-Source-Language: de\n"

#. New Year's Day.
Expand Down Expand Up @@ -121,3 +122,35 @@ msgstr "Saint-Pierre et Paul"
#. Prayer Monday.
msgid "Bettagsmontag"
msgstr "Lundi du Jeûne fédéral"

#. Knabenschiessen.
msgid "Knabenschiessen"
msgstr "Knabenschiessen"

#. Day before Good Friday.
msgid "Vortag vor Karfreitag"
msgstr "Veille du Vendredi saint"

#. Sechseläuten.
msgid "Sechseläuten"
msgstr "Sechseläuten"

#. Christmas Eve.
msgid "Heiligabend"
msgstr "Veille de Noël"

#. New Year's Eve.
msgid "Vortag vor Neujahr"
msgstr "Réveillon du Nouvel An"

#. Day before Ascension Day.
msgid "Vortag vor Auffahrt"
msgstr "Veille de l'Ascension"

#. Bridge Holiday for Ascension Day.
msgid "Brückentag nach Auffahrt"
msgstr "Jour pont après l'Ascension"

#. Bridge Holiday.
msgid "Brückentag"
msgstr "Jour pont"
49 changes: 41 additions & 8 deletions holidays/locale/it/LC_MESSAGES/CH.po
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,20 @@
# License: MIT (see LICENSE file)
#
# Switzerland holidays it localization.
#
msgid ""
msgstr ""
"Project-Id-Version: Holidays 0.42\n"
"Project-Id-Version: Holidays 0.83\n"
"POT-Creation-Date: 2023-04-10 15:41+0300\n"
"PO-Revision-Date: 2024-01-21 14:48+0200\n"
"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
"PO-Revision-Date: 2025-10-08 13:09+0700\n"
"Last-Translator: PPsyrius <ppsyrius@ppsyrius.dev>\n"
"Language-Team: Holidays Localization Team\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 3.4\n"
"X-Generator: Poedit 3.7\n"
"X-Source-Language: de\n"

#. New Year's Day.
Expand Down Expand Up @@ -84,11 +85,11 @@ msgstr "Giorno di Santo Stefano"

#. Genevan Fast.
msgid "Genfer Bettag"
msgstr "Jeûne genevois"
msgstr "Digiuno ginevrino"

#. Restoration Day.
msgid "Wiederherstellung der Republik"
msgstr "Restauration genevoise"
msgstr "Restaurazione della Repubblica"

#. Battle of Naefels Victory Day.
msgid "Näfelser Fahrt"
Expand All @@ -108,7 +109,7 @@ msgstr "San Giuseppe"

#. Saint Nicholas of Flüe.
msgid "Bruder Klaus"
msgstr "Nicolao della Flüe"
msgstr "San Nicolao della Flue"

#. Epiphany.
msgid "Heilige Drei Könige"
Expand All @@ -120,4 +121,36 @@ msgstr "Santi Pietro e Paolo"

#. Prayer Monday.
msgid "Bettagsmontag"
msgstr "Digiuno Ginevrino"
msgstr "Lunedì del digiuno federal"

#. Knabenschiessen.
msgid "Knabenschiessen"
msgstr "Knabenschiessen"

#. Day before Good Friday.
msgid "Vortag vor Karfreitag"
msgstr "Vigilia del Venerdì Santo"

#. Sechseläuten.
msgid "Sechseläuten"
msgstr "Sechseläuten"

#. Christmas Eve.
msgid "Heiligabend"
msgstr "Vigilia di Natale"

#. New Year's Eve.
msgid "Vortag vor Neujahr"
msgstr "Vigilia di Capodanno"

#. Day before Ascension Day.
msgid "Vortag vor Auffahrt"
msgstr "Vigilia dell'Ascensione di Gesù"

#. Bridge Holiday for Ascension Day.
msgid "Brückentag nach Auffahrt"
msgstr "Giorno ponte dopo l'Ascensione di Gesù"

#. Bridge Holiday.
msgid "Brückentag"
msgstr "Giorno ponte"
Loading
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载