Download (erfordert Anmeldung/Registrierung im Forum): WpsGetObjectWithGermanHolidays
Das folgende Skript ermittelt für ein beliebiges Jahr die heute bekannten festen und variablen Feiertage für Deutschland.
Die Funktion loadFixedDayHolidays(/*int*/year) und das Objekt variableHoliDays(/*int*/year, /*bool*/julian, /*object*/baseDays) sind eine wichtige Hilfe zur automatischen Erstellung eines Kalenders mit Adobe InDesign Scripting.
Code: Alles auswählen
// DESCRIPTION erzeugt deutsche Feiertage für ein beliebiges Jahr
// JavaScript für Adobe InDesign Scripting
// Dateiname: WpsGetObjectWithGermanHolidays.jsx
// projPath: C:/Users/WernerPerplies/Source/Workspaces/WpsCSharpProjects/WpsGetObjectWithGermanHolidays
// for this Script
// © 2013 - 2019 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// created: Mon Aug 12 2013 16:45:44 GMT+0200
// modified: Sun Apr 16 2017 09:13:48 GMT+0200
// modified: Fri Jun 28 2019 06:11:57 GMT+0200
// modified: Fri Jun 28 2019 07:24:24 GMT+0200
// [modified]
/*String*/scriptDate = "201906280724"; // DO NOT USE var, because this variable will be later deleted by WpsIncludes!
/*String*/scriptVersion = "1.11"; // DO NOT USE var, because this variable will be later deleted by WpsIncludes!
// includePath = "C:/Users/WernerPerplies/Source/Workspaces/WpsCSharpProjects/AppClasses/AppClasses";
// [lastFileProps:({time:"", size:, checkSum:"", scriptVersion:"", scriptDate:""})] // generated or updated by WpsIncludes!
var scriptName = "WpsGetObjectWithGermanHolidays";
var guid = "// FileID: 113658E0-AD25-43E0-86AA-6514498CC6D7";
var licensee = "Free";
var zipCodeCity = "-----";
// [end of header]
if (dateMsg === undefined)
{
var /*Object*/dateMsg = {
selectedRegionNorth: "nord-/mitteldeutsch",
selectedRegionSouth: "süddeutsch",
weekDayNamesNG: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag", "Sonnabend"],
weekDayNamesSG: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag", "Samstag"],
monthDayNames: ["Januar","Februar","März","April","Mai","Juni", "Juli","August","September", "Oktober", "November", "Dezember"]
};
}
String.prototype.fill = function(number){var filled ="";for (var i=0;i<number;++i){filled += this;}return filled;}
String.prototype.padLeft = function(fillc, length)
{if (this.length<length){return (fillc.fill(length-this.length)+this).substr(-length);}return this;}
Number.prototype.padLeft = function(fillc, length)
{return this.toString().padLeft(fillc, length);}
/*String*/Date.prototype.sDay=function(/*int*/length, /*Boolean*/string, /*Boolean*/alternate)
{
if (length==null) length = 2;
if (!(string))
return this.getDate().toString().padLeft("0",length);
else if ((string) && (alternate))
return dateMsg.weekDayNamesNG[this.getDay()].substr(0,length);
else
return dateMsg.weekDayNamesSG[this.getDay()].substr(0,length);
}
/*String*/Date.prototype.sMonth=function(/*int*/length, /*Boolean*/string)
{
if (length==null)length = 2;
if (!(string))
return (this.getMonth()+1).toString().padLeft("0",length);
else (string)
return dateMsg.monthDayNames[this.getMonth()].substr(0,length);
}
/*String*/Date.prototype.sFullYear=function()
{
return this.getFullYear().toString();
}
/*String*/Date.prototype.sGermanDate=function()
{
return this.sDay()+"."+this.sMonth()+"."+this.sFullYear();
}
// wird zur Berechnung der Variablen Feiertage benötigt
/*String*/Date.prototype.days2Ms=function(/*int*/ days)
{
return days*24*60*60*1000;
}
// wird zur Berechnung der Variablen Feiertage benötigt
/*String*/Date.prototype.addDays2Date=function( /*int*/ days)
{
var date = new Date();
date.setTime(this.getTime()+this.days2Ms(days)*1);
return date;
}
// wird zur Berechnung der Variablen Feiertage benötigt
/*String*/Date.prototype.getSpecialDay = function( /*int*/ dayOfWeek, /*int*/ whichFromStart, /*boolean*/countFirstDay)
{
// sucht den n-ten Wochentag vor/nach einem Datum
var date = this;
var day = date.getDay();
if (whichFromStart <0)
var step = -1;
else
var step = 1;
// die Anzahl der gesuchten Wochentage muss immer >= 0 sein
var c = Math.abs(whichFromStart);
if (countFirstDay != null)
if (day==dayOfWeek)
--c;
while (c > 0)
{
// je nach Vorzeichen von Step einen Tag vor oder zurück
date = date.addDays2Date(step);
if (date.getDay()==dayOfWeek)
--c; // die Anzahl der gefundenen Wochentage dekrementieren
}
return date;
}
// wird nur für das Ausgabeprogramm benötigt
// fügt zwei Arrays zusammen
/*array*/Array.prototype.add=function(array)
{
var ta = this; var l = array.length;
for (var i = 0; i<l;i++)
ta.push(array[i]);
return ta;
}
// wird nur für das Ausgabeprogramm benötigt
// sortiert ein Array: field-> numerisch oder String, adressiert das Sortierfeld
// default Feld 0
// reverse true->absteigend, default aufsteigend
/*array*/Array.prototype.sortThis=function(/*String*/field, reverse)
{
if (reverse == null) reverse = false;
if (reverse) return this.sort(sortthisDown);
else return this.sort(sortthisUp);
/*int*/function sortthisUp(e1, e2)
{
if (field==null)
{
if (e1<e2) return -1;
if (e1>e2) return 1;
return 0;
}
else
{
if (e1[field]<e2[field]) return -1;
if (e1[field]>e2[field]) return 1;
return 0;
}
}
/*int*/function sortthisDown(e1, e2)
{
if (field==null)
{
if (e1>e2) return -1;
if (e1<e2) return 1;
return 0;
}
else
{
if (e1[field]>e2[field]) return -1;
if (e1[field]<e2[field]) return 1;
return 0;
}
}
}
// wird nur für das Ausgabeprogramm benötigt
// schneidet einen String von links mit einer bestimmten Länge ab
String.prototype.left=function(length){if (this.length<length) return this; return this.substr(0,length)};
// wird nur für das Ausgabeprogramm benötigt
// ermittelt die Feldnamen eines JavaScript-Objektes
/*array */Object.prototype.properties=function()
{
var a = new Array();
for (var prop in this)
{
a.push(prop);
}
return a;
}
main();
// DESCRIPTION variableHoliDays
// Dateiname: variableHoliDays.jsx
// © 2013 by Werner Perplies, EDV-Anwendungsberatung,
// https://www.weepee.de, email: werner.perplies@weepee.de
// [created]
// [modified]
// [end of header]
function main()
{
// gewünschtes Jahr laden
var year = 2021;
// slle Feiertage mit festem Datum laden
var fixedDateHolidays = loadFixedDayHolidays(year);
// initialisert das Objekt variableHoliDays und gibt die variablen
// Feiertage zurück
var variableHolidays = new variableHoliDays(year, false).holidays;
// ergänzt die erhaltene Liste um die festen Feiertage
var holidays = variableHolidays.add(fixedDateHolidays);
// gibt die erhaltenen Feiertage in einem Fenster sortiert (nach Datum) aus
out(variableHolidays);
return;
function out(/*Array*/holidays)
{
// prepare array for sorting:
holidays = holidays.sortThis("value");
for (var i = 0; i<holidays.length; i++)
holidays[i].germanDate = holidays[i].value.sGermanDate();
var output = "";
for (var i = 0; i<holidays.length; i++)
output += holidays[i].name + ": " + holidays[i].germanDate + "\n";
alert(output);
}
// lädt die festen Feiertage in ein Array
/*object*/function loadFixedDayHolidays(/*int*/year)
{
var fixedHolidays = [];
fixedHolidays.push({name: "Neujahr", value: new Date(year,0,1)});
fixedHolidays.push({name: "HeiligeDreiKönige", value: new Date(year,0,6)});
fixedHolidays.push({name: "Valentinstag", value: new Date(year,1,14)});
fixedHolidays.push({name: "Maifeiertag", value: new Date(year,4,1)});
fixedHolidays.push({name: "Friedensfest", value: new Date(year,7,8)});
fixedHolidays.push({name: "MariäHimmelfahrt", value: new Date(year,7,8)});
fixedHolidays.push({name: "TagDerDeutschenEinheit", value: new Date(year,9,3)});
fixedHolidays.push({name: "Halloween", value: new Date(year,9,31)});
fixedHolidays.push({name: "Reformationstag", value: new Date(year,9,31)});
fixedHolidays.push({name: "Allerheiligen", value: new Date(year,10,1)});
fixedHolidays.push({name: "Allerseelen", value: new Date(year,10,2)});
fixedHolidays.push({name: "Martinstag", value: new Date(year,10,11)});
fixedHolidays.push({name: "Barbaratag", value: new Date(year,11,4)});
fixedHolidays.push({name: "Nikolaus", value: new Date(year,11,6)});
fixedHolidays.push({name: "Heiligabend", value: new Date(year,11,24)});
fixedHolidays.push({name: "ErsterWeihnachtsfeiertag", value: new Date(year,11,25)});
fixedHolidays.push({name: "ZweiterWeihnachtsfeiertag", value: new Date(year,11,26)});
fixedHolidays.push({name: "Silvester", value: new Date(year,11,31)});
return fixedHolidays;
}
// berechnet die variablen Feiertage - property holidays enthält Array mit Feiertagen
/*object*/function variableHoliDays(/*int*/year, /*bool*/julian, /*object*/baseDays)
{
// var holidays = {};
// this.holidays = holidays;
this.holidays = [];
// var dEaster = GetDateOfEasterAsDate(/*int*/year, /*bool*/julian);
// this.dEaster = dEaster;
this.dEaster = GetDateOfEasterAsDate(/*int*/year, /*bool*/julian);
// var sEaster = GetDateOfEasterAsString(/*int*/year, /*bool*/julian);
// this.sEaster = sEaster;
this.sEaster = GetDateOfEasterAsString(/*int*/year, /*bool*/julian);
if (baseDays==null)
{
var baseDays = {};
baseDays.eastSun = this.dEaster;
var date = new Date(year,11,24);
baseDays.firstAdvent = date.getSpecialDay(0,-4, true); // 4. Advent kann auf Startdatum liegen!
}
this.holidays.push({name: "Rosenmontag", value: baseDays.eastSun.addDays2Date(-48)}); // Rosenmontag
this.holidays.push({name: "Faschingsdienstag", value: baseDays.eastSun.addDays2Date(-47)}); // Faschingsdienstag
this.holidays.push({name: "Aschermittwoch", value: baseDays.eastSun.addDays2Date(-46)}); // Aschermittwoch
this.holidays.push({name: "Gründonnerstag", value: baseDays.eastSun.addDays2Date(-3)}); // Gründonnerstag
this.holidays.push({name: "Karfreitag", value: baseDays.eastSun.addDays2Date(-2)}); // Karfreitag
this.holidays.push({name: "Ostersonntag", value: baseDays.eastSun}); // Ostersonntag
this.holidays.push({name: "Ostermontag", value: baseDays.eastSun.addDays2Date(1)}); // Ostermontag
this.holidays.push({name: "Muttertag", value: (new Date(year,4,1)).getSpecialDay(0,2)}); // Muttertag
this.holidays.push({name: "Himmelfahrt", value : baseDays.eastSun.addDays2Date(39)}); // Christi Himmelfahrt
this.holidays.push({name: "Pfingstsonntag", value: baseDays.eastSun.addDays2Date(49)}); // Pfingstsonntag
this.holidays.push({name: "Pingstmontag", value: baseDays.eastSun.addDays2Date(50)}); // Pfingstmontag
this.holidays.push({name: "Fronleichnam", value: baseDays.eastSun.addDays2Date(60)}); // Fronleichnam
this.holidays.push({name: "Volkstrauertag", value: baseDays.firstAdvent.getSpecialDay(0,-2)}); // Volkstrauertag
this.holidays.push({name: "BußUndBettag", value: baseDays.firstAdvent.addDays2Date(-11)}); // Buß und Bettag
this.holidays.push({name: "Totensonntag", value: baseDays.firstAdvent.getSpecialDay(0,-1)}); // Totensonntag
this.holidays.push({name: "ErsterAdvent", value: baseDays.firstAdvent}); // 1. Advent
this.holidays.push({name: "ZweiterAdvent", value: baseDays.firstAdvent.addDays2Date(7)}); // 2. Advent
this.holidays.push({name: "DritterAdvent", value: baseDays.firstAdvent.addDays2Date(14)}); // 3. Advent
this.holidays.push({name: "VierterAdvent", value: baseDays.firstAdvent.addDays2Date(21)}); // 4. Advent
// DESCRIPTION ermittelt das Osterdatum eines Jahres
/*date*/function GetDateOfEasterAsDate(/*int*/year, /*bool*/julian)
{
// entwickelt nach https://de.wikipedia.org/wiki/Gaußsche_Osterformel
var a =year%19;
var b = year%4;
var c = year%7
var k = Math.floor(year/100);
var p = Math.floor(k/3);
var q = Math.floor(k/4);
if (julian)
{
var m = 15;
var n= 6;
}
else
{
var m = (15 + k -p -q)%30;
var n = (4 + k -q)%7;
}
var d = (19*a + m)%30;
var e = (2*b + 4*c + 6*d + n)%7;
var day = 22+d+e;
if (day > 31) {day = day-31; var month = 3;}
else var month = 2;
return new Date(year,month,day); // day+"."+month+"."+year;
}
/*string*/function GetDateOfEasterAsString(/*int*/year, /*bool*/julian)
{
var dateC = GetDateOfEasterAsDate(year, julian).toLocaleString();
return dateC.left(dateC.length-" 00:00:00".length);
}
}
}