func ErsterAdvent(x int) Feiertag {
	o := VierterAdvent(x)
	return Feiertag{o.AddDate(0, 0, -21), "Erster Advent"}
}
ErsterAdvent is the first Sunday in Advent
package feiertage
import (
	"fmt"
	"time"
)
type Feiertag struct {
	time.Time
	Text string
}
var defaultTimeFormat = "02.01.2006"
var defaultTimeZone = time.UTC
func getTimeFormat() string {
	return defaultTimeFormat
}
func SetDefaultTimeFormat(timeformat string) {
	defaultTimeFormat = timeformat
}
func SetDefaultTimeZone(timezone *time.Location) {
	defaultTimeZone = timezone
}
func getTimeZone() *time.Location {
	return defaultTimeZone
}
func (f Feiertag) String() string {
	return fmt.Sprintf("%s %s", f.Format(getTimeFormat()), f.Text)
}
type ByDate []Feiertag
func (a ByDate) Len() int {
	return len(a)
}
func (a ByDate) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}
func (a ByDate) Less(i, j int) bool {
	return a[i].UnixNano() < a[j].UnixNano()
}
func Neujahr(x int) Feiertag {
	return Feiertag{time.Date(x, time.January, 1, 0, 0, 0, 0, getTimeZone()), "Neujahr"}
}
func Epiphanias(x int) Feiertag {
	return Feiertag{time.Date(x, time.January, 6, 0, 0, 0, 0, getTimeZone()), "Epiphanias"}
}
func HeiligeDreiKönige(x int) Feiertag {
	e := Epiphanias(x)
	e.Text = "Heilige drei Könige"
	return e
}
func Valentinstag(x int) Feiertag {
	return Feiertag{time.Date(x, time.February, 14, 0, 0, 0, 0, getTimeZone()), "Valentinstag"}
}
func InternationalerTagDesGedenkensAnDieOpferDesHolocaust(x int) Feiertag {
	return Feiertag{time.Date(x, time.January, 27, 0, 0, 0, 0, getTimeZone()), "Internationaler Tag des Gedenkens an die Opfer des Holocaust"}
}
func InternationalerFrauentag(x int) Feiertag {
	return Feiertag{time.Date(x, time.March, 8, 0, 0, 0, 0, getTimeZone()), "Internationaler Frauentag"}
}
func Josefitag(x int) Feiertag {
	return Feiertag{time.Date(x, time.March, 19, 0, 0, 0, 0, getTimeZone()), "Josefitag"}
}
func Weiberfastnacht(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -52), "Weiberfastnacht"}
}
func Karnevalssonntag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -49), "Karnevalssonntag"}
}
func Rosenmontag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -48), "Rosenmontag"}
}
func Fastnacht(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -47), "Fastnacht"}
}
func Aschermittwoch(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -46), "Aschermittwoch"}
}
func Palmsonntag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -7), "Palmsonntag"}
}
func Gründonnerstag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -3), "Gründonnerstag"}
}
func Karfreitag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, -2), "Karfreitag"}
}
func Ostern(x int) Feiertag {
	k := x / 100
	m := 15 + (3*k+3)/4 - (8*k+13)/25
	s := 2 - (3*k+3)/4
	a := x % 19
	d := (19*a + m) % 30
	r := (d + a/11) / 29
	og := 21 + d - r
	sz := 7 - (x+x/4+s)%7
	oe := 7 - (og-sz)%7
	os := og + oe
	day := os % 31
	month := os/31 + 3
	return Feiertag{time.Date(x, time.Month(month), day, 0, 0, 0, 0, getTimeZone()), "Ostern"}
}
func BeginnSommerzeit(x int) Feiertag {
	o := time.Date(x, time.March, 30, 0, 0, 0, 0, getTimeZone())
	d := (7 + int(o.Weekday())) % 7
	return Feiertag{o.AddDate(0, 0, -1*d), "Beginn Sommerzeit"}
}
func Ostermontag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, 1), "Ostermontag"}
}
func Walpurgisnacht(x int) Feiertag {
	return Feiertag{time.Date(x, time.April, 30, 0, 0, 0, 0, getTimeZone()), "Walpurgisnacht"}
}
func TagDerArbeit(x int) Feiertag {
	return Feiertag{time.Date(x, time.May, 1, 0, 0, 0, 0, getTimeZone()), "Tag der Arbeit"}
}
func Staatsfeiertag(x int) Feiertag {
	e := TagDerArbeit(x)
	e.Text = "Staatsfeiertag"
	return e
}
func InternationalerTagDerPressefreiheit(x int) Feiertag {
	return Feiertag{time.Date(x, time.May, 3, 0, 0, 0, 0, getTimeZone()), "Internationaler Tag der Pressefreiheit"}
}
func Florianitag(x int) Feiertag {
	return Feiertag{time.Date(x, time.May, 4, 0, 0, 0, 0, getTimeZone()), "Florianitag"}
}
func TagDerBefreiung(x int) Feiertag {
	return Feiertag{time.Date(x, time.May, 8, 0, 0, 0, 0, getTimeZone()), "Tag der Befreiung"}
}
func Muttertag(x int) Feiertag {
	o := time.Date(x, time.May, 1, 0, 0, 0, 0, getTimeZone())
	d := (7 - int(o.Weekday())) % 7
	return Feiertag{o.AddDate(0, 0, d+7), "Muttertag"}
}
func ChristiHimmelfahrt(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, 39), "Christi Himmelfahrt"}
}
func Vatertag(x int) Feiertag {
	e := ChristiHimmelfahrt(x)
	e.Text = "Vatertag"
	return e
}
func Handtuchtag(x int) Feiertag {
	return Feiertag{time.Date(x, time.May, 25, 0, 0, 0, 0, getTimeZone()), "Handtuchtag"}
}
func TowelDay(x int) Feiertag {
	e := Handtuchtag(x)
	e.Text = "Towel Day"
	return e
}
func Pfingsten(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, 49), "Pfingsten"}
}
func Pfingstmontag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, 50), "Pfingstmontag"}
}
func Dreifaltigkeitssonntag(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, 56), "Dreifaltigkeitssonntag"}
}
func Fronleichnam(x int) Feiertag {
	o := Ostern(x)
	return Feiertag{o.AddDate(0, 0, 60), "Fronleichnam"}
}
func InternationalerKindertag(x int) Feiertag {
	return Feiertag{time.Date(x, time.June, 1, 0, 0, 0, 0, getTimeZone()), "Internationaler Kindertag"}
}
func TagDesMeeres(x int) Feiertag {
	return Feiertag{time.Date(x, time.June, 8, 0, 0, 0, 0, getTimeZone()), "Tag des Meeres"}
}
func Weltflüchtlingstag(x int) Feiertag {
	return Feiertag{time.Date(x, time.June, 20, 0, 0, 0, 0, getTimeZone()), "Weltflüchtlingstag"}
}
func SystemAdministratorAppreciationDay(x int) Feiertag {
	o := time.Date(x, time.July, 31, 0, 0, 0, 0, getTimeZone())
	d := (2 + int(o.Weekday())) % 7
	return Feiertag{o.AddDate(0, 0, -1*d), "System Administrator Appreciation Day"}
}
func MariäHimmelfahrt(x int) Feiertag {
	return Feiertag{time.Date(x, time.August, 15, 0, 0, 0, 0, getTimeZone()), "Mariä Himmelfahrt"}
}
func Rupertitag(x int) Feiertag {
	return Feiertag{time.Date(x, time.September, 24, 0, 0, 0, 0, getTimeZone()), "Rupertitag"}
}
func TagDerDeutschenEinheit(x int) Feiertag {
	return Feiertag{time.Date(x, time.October, 3, 0, 0, 0, 0, getTimeZone()), "Tag der deutschen Einheit"}
}
func TagDerVolksabstimmung(x int) Feiertag {
	return Feiertag{time.Date(x, time.October, 10, 0, 0, 0, 0, getTimeZone()), "Tag der Volksabstimmung"}
}
func Erntedankfest(x int) Feiertag {
	o := time.Date(x, time.October, 1, 0, 0, 0, 0, getTimeZone())
	d := (7 - int(o.Weekday())) % 7
	return Feiertag{o.AddDate(0, 0, d), "Erntedankfest"}
}
func Nationalfeiertag(x int) Feiertag {
	return Feiertag{time.Date(x, time.October, 26, 0, 0, 0, 0, getTimeZone()), "Nationalfeiertag"}
}
func Reformationstag(x int) Feiertag {
	return Feiertag{time.Date(x, time.October, 31, 0, 0, 0, 0, getTimeZone()), "Reformationstag"}
}
func Halloween(x int) Feiertag {
	return Feiertag{time.Date(x, time.October, 31, 0, 0, 0, 0, getTimeZone()), "Halloween"}
}
func BeginnWinterzeit(x int) Feiertag {
	o := time.Date(x, time.October, 31, 0, 0, 0, 0, getTimeZone())
	d := (7 + int(o.Weekday())) % 7
	return Feiertag{o.AddDate(0, 0, -1*d), "Beginn Winterzeit"}
}
func Allerheiligen(x int) Feiertag {
	return Feiertag{time.Date(x, time.November, 1, 0, 0, 0, 0, getTimeZone()), "Allerheiligen"}
}
func Allerseelen(x int) Feiertag {
	return Feiertag{time.Date(x, time.November, 2, 0, 0, 0, 0, getTimeZone()), "Allerseelen"}
}
func Martinstag(x int) Feiertag {
	return Feiertag{time.Date(x, time.November, 11, 0, 0, 0, 0, getTimeZone()), "Martinstag"}
}
func Karnevalsbeginn(x int) Feiertag {
	return Feiertag{time.Date(x, time.November, 11, 11, 11, 11, 11, getTimeZone()), "Karnevalsbeginn"}
}
func Leopolditag(x int) Feiertag {
	return Feiertag{time.Date(x, time.November, 15, 0, 0, 0, 0, getTimeZone()), "Leopolditag"}
}
func Weltkindertag(x int) Feiertag {
	return Feiertag{time.Date(x, time.September, 20, 0, 0, 0, 0, getTimeZone()), "Weltkindertag"}
}
func BußUndBettag(x int) Feiertag {
	o := time.Date(x, time.November, 22, 0, 0, 0, 0, getTimeZone())
	d := (4 + int(o.Weekday())) % 7
	return Feiertag{o.AddDate(0, 0, -1*d), "Buß- und Bettag"}
}
func Thanksgiving(x int) Feiertag {
	o := time.Date(x, time.November, 1, 0, 0, 0, 0, getTimeZone())
	d := ((11 - int(o.Weekday())) % 7)
	return Feiertag{o.AddDate(0, 0, 21+d), "Thanksgiving (US)"}
}
func Blackfriday(x int) Feiertag {
	return Feiertag{Thanksgiving(x).AddDate(0, 0, 1), "Blackfriday"}
}
func Volkstrauertag(x int) Feiertag {
	o := ErsterAdvent(x)
	return Feiertag{o.AddDate(0, 0, -14), "Volkstrauertag"}
}
func Nikolaus(x int) Feiertag {
	return Feiertag{time.Date(x, time.December, 6, 0, 0, 0, 0, getTimeZone()), "Nikolaus"}
}
func MariäUnbefleckteEmpfängnis(x int) Feiertag {
	return Feiertag{time.Date(x, time.December, 8, 0, 0, 0, 0, getTimeZone()), "Mariä unbefleckte Empfängnis"}
}
func MariäEmpfängnis(x int) Feiertag {
	e := MariäUnbefleckteEmpfängnis(x)
	e.Text = "Mariä Empfängnis"
	return e
}
func Totensonntag(x int) Feiertag {
	o := VierterAdvent(x)
	return Feiertag{o.AddDate(0, 0, -28), "Totensonntag"}
}