Feiertage Implementiert
Feiertage werden nun ausgegraut ^^
This commit is contained in:
@@ -6,6 +6,7 @@ import WeekSelector from "@/components/WeekSelector";
|
|||||||
import {baseURL} from "@/components/Constants";
|
import {baseURL} from "@/components/Constants";
|
||||||
import {ErrorType} from "@/components/ErrorType";
|
import {ErrorType} from "@/components/ErrorType";
|
||||||
import BasicDateCalendar from "@/components/CalendarSideBar";
|
import BasicDateCalendar from "@/components/CalendarSideBar";
|
||||||
|
import feiertagejs from "feiertagejs";
|
||||||
|
|
||||||
let cellHeight = 20;
|
let cellHeight = 20;
|
||||||
|
|
||||||
@@ -54,10 +55,6 @@ export default function CalenderView(p) {
|
|||||||
let maxLunchBreak = 0
|
let maxLunchBreak = 0
|
||||||
let daySum = 0
|
let daySum = 0
|
||||||
for (let j = 0; j < en[i].length; j++) {
|
for (let j = 0; j < en[i].length; j++) {
|
||||||
if (en[i][j] != null){
|
|
||||||
console.log(currentsid + " " + en[i][j].semesterid)
|
|
||||||
|
|
||||||
}
|
|
||||||
if (en[i][j] != null && currentsid == (en[i][j]).semesterid) {
|
if (en[i][j] != null && currentsid == (en[i][j]).semesterid) {
|
||||||
let elem = en[i][j]
|
let elem = en[i][j]
|
||||||
|
|
||||||
@@ -143,6 +140,7 @@ export default function CalenderView(p) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let j = 0;
|
let j = 0;
|
||||||
@@ -151,6 +149,10 @@ export default function CalenderView(p) {
|
|||||||
grayedOut[j] = i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) < semesterStart && semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterStartYear || i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) > semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterEndYear
|
grayedOut[j] = i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) < semesterStart && semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterStartYear || i % Math.round(((new Date(currentYear, 11, 31) - new Date(currentYear, 0, 0)) / (1000 * 60 * 60 * 24))) > semesterEnd && new Date(currentYear, 0, currentWeekStartDay + j).getFullYear() == semesterEndYear
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
|
for (let i = 0; i < 6; i++) {
|
||||||
|
let date = new Date(currentYear, 0, currentWeekStartDay+i)
|
||||||
|
grayedOut[i] = holiday(currentYear, date.getMonth(), date.getDate())
|
||||||
|
}
|
||||||
|
|
||||||
setEntries(en)
|
setEntries(en)
|
||||||
})
|
})
|
||||||
@@ -187,6 +189,12 @@ export default function CalenderView(p) {
|
|||||||
}).then(r => readEntries())
|
}).then(r => readEntries())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function holiday(year, month, day){
|
||||||
|
var feiertagejs = require('feiertagejs');
|
||||||
|
let today = new Date(year, month, day)
|
||||||
|
return feiertagejs.isHoliday(today, 'BW')
|
||||||
|
}
|
||||||
|
|
||||||
function checkForElementAtRow(row, column) {
|
function checkForElementAtRow(row, column) {
|
||||||
let currentList = entries[column];
|
let currentList = entries[column];
|
||||||
for (let i = 0; i < currentList.length; i++) {
|
for (let i = 0; i < currentList.length; i++) {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export default function SemesteroverviewLecturer(p) {
|
|||||||
fetch(semesterURL).then(r => r.json()).then(sem => {
|
fetch(semesterURL).then(r => r.json()).then(sem => {
|
||||||
sem.map(e => {
|
sem.map(e => {
|
||||||
let progessURL = baseURL + "/entries/planned?sessionid=" + localStorage.getItem("sessionid") + "&semesterid=" + e.id;
|
let progessURL = baseURL + "/entries/planned?sessionid=" + localStorage.getItem("sessionid") + "&semesterid=" + e.id;
|
||||||
fetch(progessURL).then(r => r.json()).then(en => console.log(en))
|
fetch(progessURL).then(r => r.json()).then(en => console.log(en)) // TODO: Progressbar
|
||||||
temp.push(e.name)
|
temp.push(e.name)
|
||||||
})
|
})
|
||||||
}).then(() => setSemesterNames(temp))
|
}).then(() => setSemesterNames(temp))
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "TIF22A_AnwProjekt_B",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"node_modules/feiertagejs": {
|
||||||
|
"version": "1.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/feiertagejs/-/feiertagejs-1.3.9.tgz",
|
||||||
|
"integrity": "sha512-tUP+WBv2OWBhPwe3NfqwCtjMq+ym598a42tfqmL0FySswEb9xs96p2iKwqqx+lxKieu1njJBRZKsFm92bJhxZw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Simon Fakir
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
+93
@@ -0,0 +1,93 @@
|
|||||||
|
# Feiertage.js
|
||||||
|
|
||||||
|
[](https://badge.fury.io/js/feiertagejs)
|
||||||
|
[](https://travis-ci.org/sfakir/feiertagejs)
|
||||||
|
|
||||||
|
|
||||||
|
Feiertage.js is a small *typescript* npm module without dependencies to calculate German holidays for each Bundesland.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
- [yarn](https://yarnpkg.com/en/): `yarn add feiertagejs`
|
||||||
|
- [npm](https://www.npmjs.com/): `npm install feiertagejs`
|
||||||
|
- [bower](https://bower.io/): `bower install feiertagejs` *outdated!*
|
||||||
|
- [Plain Javascript](http://extern.fakir.it/feiertagejs/feiertagejs.zip) *outdated!*
|
||||||
|
|
||||||
|
## Quick Examples
|
||||||
|
|
||||||
|
### ES Modules (Typescript/Javasript)
|
||||||
|
|
||||||
|
The prefered whay is to directly import the typescript module. However, you can also use .js.
|
||||||
|
Please find here some examples and full api [here](docs.md).
|
||||||
|
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { getHolidays, isHoliday, isSpecificHoliday } from 'feiertagejs';
|
||||||
|
|
||||||
|
const today = new Date();
|
||||||
|
|
||||||
|
console.log(isHoliday(today, 'BW'));
|
||||||
|
// probably false, because you are working ;)
|
||||||
|
|
||||||
|
// check if a day is a specific holiday:
|
||||||
|
console.log(isSpecificHoliday(today, 'CHRISTIHIMMELFAHRT','ALL'));
|
||||||
|
|
||||||
|
// get all holiday for a single year: getHolidays()
|
||||||
|
// returns an array of "Holiday" Objects. Please see the docs.md for all properties.
|
||||||
|
const holidays2023 = getHolidays('2023','BUND');
|
||||||
|
|
||||||
|
|
||||||
|
console.log('date', holidays2023[0].date); // = Date("2023-01-01");
|
||||||
|
console.log('name', holidays2023[0].name); // 'NEUJAHRSTAG' (constant)
|
||||||
|
console.log('translation', holidays2023[0].trans('de')); // German translation: Neujahrstag
|
||||||
|
console.log('equals?', holidays2023[0].equals(date)); // Compare days only (ignore time)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage in Node.js
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var feiertagejs = require('feiertagejs');
|
||||||
|
|
||||||
|
var today = new Date();
|
||||||
|
|
||||||
|
console.log(feiertagejs.isHoliday(today, 'BW'));
|
||||||
|
// probably false, because you are working ;)
|
||||||
|
|
||||||
|
// check if a day is a specific holiday:
|
||||||
|
console.log(feiertagejs.isSpecificHoliday(today, 'CHRISTIHIMMELFAHRT'));
|
||||||
|
|
||||||
|
// get all holiday for a single year: getHolidays()
|
||||||
|
// returns an array of "Holiday" Objects. Please see the docs.md for all properties.
|
||||||
|
|
||||||
|
var holidays2023 = feiertagejs.getHolidays('2023', 'BUND');
|
||||||
|
|
||||||
|
console.log('date', holidays2023[0].date); // = Date("2023-01-01");
|
||||||
|
console.log('name', holidays2023[0].name); // 'NEUJAHRSTAG' (constant)
|
||||||
|
console.log('translation', holidays2023[0].translate()); // German translation: Neujahrstag
|
||||||
|
console.log('equals?', holidays2023[0].equals(date)); // Compare days only (ignore time)
|
||||||
|
```
|
||||||
|
|
||||||
|
## API doc
|
||||||
|
|
||||||
|
The full API doc can be found [here](docs.md).
|
||||||
|
|
||||||
|
|
||||||
|
## Feedback and Questions
|
||||||
|
|
||||||
|
You have two options two give feedback or ask questions:
|
||||||
|
|
||||||
|
* Comment the official release [post](https://fakir.tech/de/feiertage-js-deutsche-feiertage-fuer-node-js-und-browser-javascript/)
|
||||||
|
* Open issues or pullrequests on [github](https://github.com/sfakir/feiertagejs)
|
||||||
|
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
Thank you for contributing:
|
||||||
|
|
||||||
|
* thetric
|
||||||
|
* SteveOswald
|
||||||
|
|
||||||
|
|
||||||
|
## Feedback
|
||||||
|
|
||||||
|
If you have any questions, feel free to open an issue.
|
||||||
+476
@@ -0,0 +1,476 @@
|
|||||||
|
const germanTranslations = {
|
||||||
|
NEUJAHRSTAG: 'Neujahrstag',
|
||||||
|
HEILIGEDREIKOENIGE: 'Heilige Drei Könige',
|
||||||
|
KARFREITAG: 'Karfreitag',
|
||||||
|
OSTERSONNTAG: 'Ostersonntag',
|
||||||
|
OSTERMONTAG: 'Ostermontag',
|
||||||
|
TAG_DER_ARBEIT: 'Tag der Arbeit',
|
||||||
|
CHRISTIHIMMELFAHRT: 'Christi Himmelfahrt',
|
||||||
|
PFINGSTSONNTAG: 'Pfingstsonntag',
|
||||||
|
PFINGSTMONTAG: 'Pfingstmontag',
|
||||||
|
FRONLEICHNAM: 'Fronleichnam',
|
||||||
|
MARIAHIMMELFAHRT: 'Mariä Himmelfahrt',
|
||||||
|
DEUTSCHEEINHEIT: 'Tag der Deutschen Einheit',
|
||||||
|
REFORMATIONSTAG: 'Reformationstag',
|
||||||
|
ALLERHEILIGEN: 'Allerheiligen',
|
||||||
|
BUBETAG: 'Buß- und Bettag',
|
||||||
|
ERSTERWEIHNACHTSFEIERTAG: '1. Weihnachtstag',
|
||||||
|
ZWEITERWEIHNACHTSFEIERTAG: '2. Weihnachtstag',
|
||||||
|
WELTKINDERTAG: 'Weltkindertag',
|
||||||
|
WELTFRAUENTAG: 'Weltfrauentag',
|
||||||
|
AUGSBURGER_FRIEDENSFEST: 'Augsburger Friedensfest',
|
||||||
|
};
|
||||||
|
|
||||||
|
const allHolidays = [
|
||||||
|
'NEUJAHRSTAG',
|
||||||
|
'HEILIGEDREIKOENIGE',
|
||||||
|
'KARFREITAG',
|
||||||
|
'OSTERSONNTAG',
|
||||||
|
'OSTERMONTAG',
|
||||||
|
'TAG_DER_ARBEIT',
|
||||||
|
'CHRISTIHIMMELFAHRT',
|
||||||
|
'MARIAHIMMELFAHRT',
|
||||||
|
'PFINGSTSONNTAG',
|
||||||
|
'PFINGSTMONTAG',
|
||||||
|
'FRONLEICHNAM',
|
||||||
|
'DEUTSCHEEINHEIT',
|
||||||
|
'REFORMATIONSTAG',
|
||||||
|
'ALLERHEILIGEN',
|
||||||
|
'BUBETAG',
|
||||||
|
'ERSTERWEIHNACHTSFEIERTAG',
|
||||||
|
'ZWEITERWEIHNACHTSFEIERTAG',
|
||||||
|
'WELTKINDERTAG',
|
||||||
|
'WELTFRAUENTAG',
|
||||||
|
'AUGSBURGER_FRIEDENSFEST',
|
||||||
|
];
|
||||||
|
|
||||||
|
const allRegions = [
|
||||||
|
'BW',
|
||||||
|
'BY',
|
||||||
|
'BE',
|
||||||
|
'BB',
|
||||||
|
'HB',
|
||||||
|
'HE',
|
||||||
|
'HH',
|
||||||
|
'MV',
|
||||||
|
'NI',
|
||||||
|
'NW',
|
||||||
|
'RP',
|
||||||
|
'SL',
|
||||||
|
'SN',
|
||||||
|
'ST',
|
||||||
|
'SH',
|
||||||
|
'TH',
|
||||||
|
'BUND',
|
||||||
|
'AUGSBURG',
|
||||||
|
'ALL',
|
||||||
|
];
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* feiertage.js
|
||||||
|
* @repository https://github.com/sfakir/feiertagejs
|
||||||
|
* @docs https://github.com/sfakir/feiertagejs/blob/master/docs.md
|
||||||
|
*
|
||||||
|
* Copyright 2015-2021 Simon Fakir
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
// translations
|
||||||
|
const defaultLanguage = 'de';
|
||||||
|
let currentLanguage = defaultLanguage;
|
||||||
|
const translations = {
|
||||||
|
de: germanTranslations,
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* adds a translation for the holidays (e.g. english).
|
||||||
|
* This also allows to override the German names.
|
||||||
|
* Hint: Interpolates German for missing translations
|
||||||
|
* @param {string} isoCode of the new language
|
||||||
|
* @param {TranslationTable} newTranslation map of {HolidayType} to translation stringg
|
||||||
|
*/
|
||||||
|
function addTranslation(isoCode, newTranslation) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
const defaultTranslation = translations[defaultLanguage];
|
||||||
|
let missingFields = false;
|
||||||
|
// fill new Translation with default Language
|
||||||
|
for (const holiday of allHolidays) {
|
||||||
|
if (!newTranslation[holiday]) {
|
||||||
|
missingFields = true;
|
||||||
|
newTranslation[holiday] = defaultTranslation[holiday];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (missingFields) {
|
||||||
|
console.warn('[feiertagejs] addTranslation: you did not add all holidays in your translation! Took German as fallback');
|
||||||
|
}
|
||||||
|
translations[code] = newTranslation;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a language to default language
|
||||||
|
* @param {string} isoCode
|
||||||
|
*/
|
||||||
|
function setLanguage(isoCode) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
if (!translations[code]) {
|
||||||
|
throw new TypeError(`[feiertagejs] tried to set language to ${code} but the translation is missing. Please use addTranslation(isoCode,object) first`);
|
||||||
|
}
|
||||||
|
currentLanguage = isoCode;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get currently set language
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
function getLanguage() {
|
||||||
|
return currentLanguage;
|
||||||
|
}
|
||||||
|
// holidays api
|
||||||
|
/**
|
||||||
|
* Checks if a specific date is sunday or holiday.
|
||||||
|
* @param date
|
||||||
|
* @param region
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isSunOrHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
return date.getDay() === 0 || isHoliday(date, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Check is specific date is holiday.
|
||||||
|
* @param date
|
||||||
|
* @param {Region} region two character {@link Region} code
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const internalDate = toUtcTimestamp(date);
|
||||||
|
const holidays = getHolidaysAsUtcTimestamps(year, region);
|
||||||
|
return holidays.indexOf(internalDate) !== -1;
|
||||||
|
}
|
||||||
|
function getHolidayByDate(date, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
return holidays.find((holiday) => holiday.equals(date));
|
||||||
|
}
|
||||||
|
// additional runtime checks
|
||||||
|
/**
|
||||||
|
* Checks if the given region is a valid {@link Region}.
|
||||||
|
*
|
||||||
|
* @param region {@link Region} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkRegion(region) {
|
||||||
|
if (region === null || region === undefined) {
|
||||||
|
throw new Error(`Region must not be undefined or null`);
|
||||||
|
}
|
||||||
|
if (allRegions.indexOf(region) === -1) {
|
||||||
|
throw new Error(`Invalid region: ${region}! Must be one of ${allRegions.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Checks if the given holidayName is a valid {@link HolidayType}.
|
||||||
|
* @param holidayName {@link HolidayType} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkHolidayType(holidayName) {
|
||||||
|
if (holidayName === null || holidayName === undefined) {
|
||||||
|
throw new TypeError('holidayName must not be null or undefined');
|
||||||
|
}
|
||||||
|
if (allHolidays.indexOf(holidayName) === -1) {
|
||||||
|
throw new Error(`feiertage.js: invalid holiday type "${holidayName}"! Must be one of ${allHolidays.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function isSpecificHoliday(date, holidayName, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
checkHolidayType(holidayName);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
const foundHoliday = holidays.find((holiday) => holiday.equals(date));
|
||||||
|
if (!foundHoliday) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return foundHoliday.name === holidayName;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns all holidays of a year in a {@link Region}.
|
||||||
|
* @param year
|
||||||
|
* @param region
|
||||||
|
* @returns {Array.<Holiday>}
|
||||||
|
*/
|
||||||
|
function getHolidays(year, region) {
|
||||||
|
let y;
|
||||||
|
if (typeof year === 'string') {
|
||||||
|
y = parseInt(year, 10);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
y = year;
|
||||||
|
}
|
||||||
|
checkRegion(region);
|
||||||
|
return getHolidaysOfYear(y, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {number[]}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysAsUtcTimestamps(year, region) {
|
||||||
|
const holidays = getHolidaysOfYear(year, region);
|
||||||
|
return holidays.map((holiday) => toUtcTimestamp(holiday.date));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {{objects: Array.<Holiday>, integers}}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysOfYear(year, region) {
|
||||||
|
const easterDate = getEasterDate(year);
|
||||||
|
const karfreitag = addDays(new Date(easterDate.getTime()), -2);
|
||||||
|
const ostermontag = addDays(new Date(easterDate.getTime()), 1);
|
||||||
|
const christiHimmelfahrt = addDays(new Date(easterDate.getTime()), 39);
|
||||||
|
const pfingstsonntag = addDays(new Date(easterDate.getTime()), 49);
|
||||||
|
const pfingstmontag = addDays(new Date(easterDate.getTime()), 50);
|
||||||
|
const holidays = [
|
||||||
|
...getCommonHolidays(year),
|
||||||
|
newHoliday('KARFREITAG', karfreitag),
|
||||||
|
newHoliday('OSTERMONTAG', ostermontag),
|
||||||
|
newHoliday('CHRISTIHIMMELFAHRT', christiHimmelfahrt),
|
||||||
|
newHoliday('PFINGSTMONTAG', pfingstmontag),
|
||||||
|
];
|
||||||
|
addHeiligeDreiKoenige(year, region, holidays);
|
||||||
|
addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, holidays);
|
||||||
|
addFronleichnam(region, easterDate, holidays);
|
||||||
|
addMariaeHimmelfahrt(year, region, holidays);
|
||||||
|
addReformationstag(year, region, holidays);
|
||||||
|
addAllerheiligen(year, region, holidays);
|
||||||
|
addBussUndBetttag(year, region, holidays);
|
||||||
|
addWeltkindertag(year, region, holidays);
|
||||||
|
addWeltfrauenTag(year, region, holidays);
|
||||||
|
addRegionalHolidays(year, region, holidays);
|
||||||
|
return holidays.sort((a, b) => a.date.getTime() - b.date.getTime());
|
||||||
|
}
|
||||||
|
function getCommonHolidays(year) {
|
||||||
|
return [
|
||||||
|
newHoliday('NEUJAHRSTAG', makeDate(year, 1, 1)),
|
||||||
|
newHoliday('TAG_DER_ARBEIT', makeDate(year, 5, 1)),
|
||||||
|
newHoliday('DEUTSCHEEINHEIT', makeDate(year, 10, 3)),
|
||||||
|
newHoliday('ERSTERWEIHNACHTSFEIERTAG', makeDate(year, 12, 25)),
|
||||||
|
newHoliday('ZWEITERWEIHNACHTSFEIERTAG', makeDate(year, 12, 26)),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
function addRegionalHolidays(year, region, feiertageObjects) {
|
||||||
|
if (region === 'AUGSBURG') {
|
||||||
|
feiertageObjects.push(newHoliday('AUGSBURGER_FRIEDENSFEST', makeDate(year, 8, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addHeiligeDreiKoenige(year, region, feiertageObjects) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('HEILIGEDREIKOENIGE', makeDate(year, 1, 6)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, feiertageObjects) {
|
||||||
|
if (region === 'BB' || region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('OSTERSONNTAG', easterDate), newHoliday('PFINGSTSONNTAG', pfingstsonntag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addFronleichnam(region, easterDate, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'HE' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
const fronleichnam = addDays(new Date(easterDate.getTime()), 60);
|
||||||
|
holidays.push(newHoliday('FRONLEICHNAM', fronleichnam));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addMariaeHimmelfahrt(year, region, holidays) {
|
||||||
|
if (region === 'SL' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('MARIAHIMMELFAHRT', makeDate(year, 8, 15)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addReformationstag(year, region, holidays) {
|
||||||
|
if (year === 2017 ||
|
||||||
|
region === 'NI' ||
|
||||||
|
region === 'BB' ||
|
||||||
|
region === 'HB' ||
|
||||||
|
region === 'HH' ||
|
||||||
|
region === 'MV' ||
|
||||||
|
region === 'SN' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'TH' ||
|
||||||
|
region === 'SH' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('REFORMATIONSTAG', makeDate(year, 10, 31)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addAllerheiligen(year, region, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('ALLERHEILIGEN', makeDate(year, 11, 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addBussUndBetttag(year, region, holidays) {
|
||||||
|
if (region === 'SN' || region === 'ALL') {
|
||||||
|
// @todo write test
|
||||||
|
const bussbettag = getBussBettag(year);
|
||||||
|
holidays.push(newHoliday('BUBETAG', makeDate(bussbettag.getUTCFullYear(), bussbettag.getUTCMonth() + 1, bussbettag.getUTCDate())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltkindertag(year, region, holidays) {
|
||||||
|
if (year >= 2019 && (region === 'TH' || region === 'ALL')) {
|
||||||
|
holidays.push(newHoliday('WELTKINDERTAG', makeDate(year, 9, 20)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltfrauenTag(year, region, feiertageObjects) {
|
||||||
|
if (year <= 2018) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (region === 'BE' || region === 'ALL') {
|
||||||
|
// in Berlin ist der Weltfrauentag ein Feiertag seit 2018
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
if (region === 'MV' && year >= 2023) {
|
||||||
|
// in MV wird der Weltfrauentag erst ab 2023 eingeführt
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Calculates the Easter date of a given year.
|
||||||
|
* @param year {number}
|
||||||
|
* @returns {Date} Easter date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getEasterDate(year) {
|
||||||
|
const C = Math.floor(year / 100);
|
||||||
|
// tslint:disable:binary-expression-operand-order
|
||||||
|
// tslint generates false positives in the following blocks
|
||||||
|
const N = year - 19 * Math.floor(year / 19);
|
||||||
|
const K = Math.floor((C - 17) / 25);
|
||||||
|
let I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;
|
||||||
|
I -= 30 * Math.floor(I / 30);
|
||||||
|
I -=
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
(1 -
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
Math.floor(29 / (I + 1)) *
|
||||||
|
Math.floor((21 - N) / 11));
|
||||||
|
let J = year + Math.floor(year / 4) + I + 2 - C + Math.floor(C / 4);
|
||||||
|
J -= 7 * Math.floor(J / 7);
|
||||||
|
const L = I - J;
|
||||||
|
const M = 3 + Math.floor((L + 40) / 44);
|
||||||
|
const D = L + 28 - 31 * Math.floor(M / 4);
|
||||||
|
// tslint:enable:binary-expression-operand-order
|
||||||
|
return new Date(year, M - 1, D);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Computes the "Buss- und Bettag"'s date.
|
||||||
|
* @param jahr {number}
|
||||||
|
* @returns {Date} the year's "Buss- und Bettag" date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getBussBettag(jahr) {
|
||||||
|
const weihnachten = new Date(jahr, 11, 25, 12, 0, 0);
|
||||||
|
const ersterAdventOffset = 32;
|
||||||
|
let wochenTagOffset = weihnachten.getDay() % 7;
|
||||||
|
if (wochenTagOffset === 0) {
|
||||||
|
wochenTagOffset = 7;
|
||||||
|
}
|
||||||
|
const tageVorWeihnachten = wochenTagOffset + ersterAdventOffset;
|
||||||
|
let bbtag = new Date(weihnachten.getTime());
|
||||||
|
bbtag = addDays(bbtag, -tageVorWeihnachten);
|
||||||
|
return bbtag;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Adds {@code days} days to the given {@link Date}.
|
||||||
|
* @param date
|
||||||
|
* @param days
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function addDays(date, days) {
|
||||||
|
const changedDate = new Date(date);
|
||||||
|
changedDate.setDate(date.getDate() + days);
|
||||||
|
return changedDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Date}.
|
||||||
|
* @param year
|
||||||
|
* @param naturalMonth month (1-12)
|
||||||
|
* @param day
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function makeDate(year, naturalMonth, day) {
|
||||||
|
return new Date(year, naturalMonth - 1, day);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param date
|
||||||
|
* @returns {Holiday}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function newHoliday(name, date) {
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
date,
|
||||||
|
dateString: localeDateObjectToDateString(date),
|
||||||
|
trans(lang = currentLanguage) {
|
||||||
|
console.warn('FeiertageJs: You are using "Holiday.trans() method. This will be replaced in the next major version with translate()"');
|
||||||
|
return this.translate(lang);
|
||||||
|
},
|
||||||
|
translate(lang = currentLanguage) {
|
||||||
|
return lang === undefined || lang === null
|
||||||
|
? undefined
|
||||||
|
: translations[lang][this.name];
|
||||||
|
},
|
||||||
|
getNormalizedDate() {
|
||||||
|
return toUtcTimestamp(this.date);
|
||||||
|
},
|
||||||
|
equals(otherDate) {
|
||||||
|
const dateString = localeDateObjectToDateString(otherDate);
|
||||||
|
return this.dateString === dateString;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @returns {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function localeDateObjectToDateString(date) {
|
||||||
|
const normalizedDate = new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000);
|
||||||
|
normalizedDate.setUTCHours(0, 0, 0, 0);
|
||||||
|
return normalizedDate.toISOString().slice(0, 10);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the UTC timestamp of the given date with hours, minutes, seconds, and milliseconds set to zero.
|
||||||
|
* @param date
|
||||||
|
* @returns {number} UTC timestamp
|
||||||
|
*/
|
||||||
|
function toUtcTimestamp(date) {
|
||||||
|
const internalDate = new Date(date);
|
||||||
|
internalDate.setHours(0, 0, 0, 0);
|
||||||
|
return internalDate.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
export { addTranslation, getHolidayByDate, getHolidays, getLanguage, isHoliday, isSpecificHoliday, isSunOrHoliday, setLanguage };
|
||||||
|
//# sourceMappingURL=feiertage.esm.js.map
|
||||||
+1
File diff suppressed because one or more lines are too long
+476
@@ -0,0 +1,476 @@
|
|||||||
|
const germanTranslations = {
|
||||||
|
NEUJAHRSTAG: 'Neujahrstag',
|
||||||
|
HEILIGEDREIKOENIGE: 'Heilige Drei Könige',
|
||||||
|
KARFREITAG: 'Karfreitag',
|
||||||
|
OSTERSONNTAG: 'Ostersonntag',
|
||||||
|
OSTERMONTAG: 'Ostermontag',
|
||||||
|
TAG_DER_ARBEIT: 'Tag der Arbeit',
|
||||||
|
CHRISTIHIMMELFAHRT: 'Christi Himmelfahrt',
|
||||||
|
PFINGSTSONNTAG: 'Pfingstsonntag',
|
||||||
|
PFINGSTMONTAG: 'Pfingstmontag',
|
||||||
|
FRONLEICHNAM: 'Fronleichnam',
|
||||||
|
MARIAHIMMELFAHRT: 'Mariä Himmelfahrt',
|
||||||
|
DEUTSCHEEINHEIT: 'Tag der Deutschen Einheit',
|
||||||
|
REFORMATIONSTAG: 'Reformationstag',
|
||||||
|
ALLERHEILIGEN: 'Allerheiligen',
|
||||||
|
BUBETAG: 'Buß- und Bettag',
|
||||||
|
ERSTERWEIHNACHTSFEIERTAG: '1. Weihnachtstag',
|
||||||
|
ZWEITERWEIHNACHTSFEIERTAG: '2. Weihnachtstag',
|
||||||
|
WELTKINDERTAG: 'Weltkindertag',
|
||||||
|
WELTFRAUENTAG: 'Weltfrauentag',
|
||||||
|
AUGSBURGER_FRIEDENSFEST: 'Augsburger Friedensfest',
|
||||||
|
};
|
||||||
|
|
||||||
|
const allHolidays = [
|
||||||
|
'NEUJAHRSTAG',
|
||||||
|
'HEILIGEDREIKOENIGE',
|
||||||
|
'KARFREITAG',
|
||||||
|
'OSTERSONNTAG',
|
||||||
|
'OSTERMONTAG',
|
||||||
|
'TAG_DER_ARBEIT',
|
||||||
|
'CHRISTIHIMMELFAHRT',
|
||||||
|
'MARIAHIMMELFAHRT',
|
||||||
|
'PFINGSTSONNTAG',
|
||||||
|
'PFINGSTMONTAG',
|
||||||
|
'FRONLEICHNAM',
|
||||||
|
'DEUTSCHEEINHEIT',
|
||||||
|
'REFORMATIONSTAG',
|
||||||
|
'ALLERHEILIGEN',
|
||||||
|
'BUBETAG',
|
||||||
|
'ERSTERWEIHNACHTSFEIERTAG',
|
||||||
|
'ZWEITERWEIHNACHTSFEIERTAG',
|
||||||
|
'WELTKINDERTAG',
|
||||||
|
'WELTFRAUENTAG',
|
||||||
|
'AUGSBURGER_FRIEDENSFEST',
|
||||||
|
];
|
||||||
|
|
||||||
|
const allRegions = [
|
||||||
|
'BW',
|
||||||
|
'BY',
|
||||||
|
'BE',
|
||||||
|
'BB',
|
||||||
|
'HB',
|
||||||
|
'HE',
|
||||||
|
'HH',
|
||||||
|
'MV',
|
||||||
|
'NI',
|
||||||
|
'NW',
|
||||||
|
'RP',
|
||||||
|
'SL',
|
||||||
|
'SN',
|
||||||
|
'ST',
|
||||||
|
'SH',
|
||||||
|
'TH',
|
||||||
|
'BUND',
|
||||||
|
'AUGSBURG',
|
||||||
|
'ALL',
|
||||||
|
];
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* feiertage.js
|
||||||
|
* @repository https://github.com/sfakir/feiertagejs
|
||||||
|
* @docs https://github.com/sfakir/feiertagejs/blob/master/docs.md
|
||||||
|
*
|
||||||
|
* Copyright 2015-2021 Simon Fakir
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
// translations
|
||||||
|
const defaultLanguage = 'de';
|
||||||
|
let currentLanguage = defaultLanguage;
|
||||||
|
const translations = {
|
||||||
|
de: germanTranslations,
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* adds a translation for the holidays (e.g. english).
|
||||||
|
* This also allows to override the German names.
|
||||||
|
* Hint: Interpolates German for missing translations
|
||||||
|
* @param {string} isoCode of the new language
|
||||||
|
* @param {TranslationTable} newTranslation map of {HolidayType} to translation stringg
|
||||||
|
*/
|
||||||
|
function addTranslation(isoCode, newTranslation) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
const defaultTranslation = translations[defaultLanguage];
|
||||||
|
let missingFields = false;
|
||||||
|
// fill new Translation with default Language
|
||||||
|
for (const holiday of allHolidays) {
|
||||||
|
if (!newTranslation[holiday]) {
|
||||||
|
missingFields = true;
|
||||||
|
newTranslation[holiday] = defaultTranslation[holiday];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (missingFields) {
|
||||||
|
console.warn('[feiertagejs] addTranslation: you did not add all holidays in your translation! Took German as fallback');
|
||||||
|
}
|
||||||
|
translations[code] = newTranslation;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a language to default language
|
||||||
|
* @param {string} isoCode
|
||||||
|
*/
|
||||||
|
function setLanguage(isoCode) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
if (!translations[code]) {
|
||||||
|
throw new TypeError(`[feiertagejs] tried to set language to ${code} but the translation is missing. Please use addTranslation(isoCode,object) first`);
|
||||||
|
}
|
||||||
|
currentLanguage = isoCode;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get currently set language
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
function getLanguage() {
|
||||||
|
return currentLanguage;
|
||||||
|
}
|
||||||
|
// holidays api
|
||||||
|
/**
|
||||||
|
* Checks if a specific date is sunday or holiday.
|
||||||
|
* @param date
|
||||||
|
* @param region
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isSunOrHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
return date.getDay() === 0 || isHoliday(date, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Check is specific date is holiday.
|
||||||
|
* @param date
|
||||||
|
* @param {Region} region two character {@link Region} code
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const internalDate = toUtcTimestamp(date);
|
||||||
|
const holidays = getHolidaysAsUtcTimestamps(year, region);
|
||||||
|
return holidays.indexOf(internalDate) !== -1;
|
||||||
|
}
|
||||||
|
function getHolidayByDate(date, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
return holidays.find((holiday) => holiday.equals(date));
|
||||||
|
}
|
||||||
|
// additional runtime checks
|
||||||
|
/**
|
||||||
|
* Checks if the given region is a valid {@link Region}.
|
||||||
|
*
|
||||||
|
* @param region {@link Region} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkRegion(region) {
|
||||||
|
if (region === null || region === undefined) {
|
||||||
|
throw new Error(`Region must not be undefined or null`);
|
||||||
|
}
|
||||||
|
if (allRegions.indexOf(region) === -1) {
|
||||||
|
throw new Error(`Invalid region: ${region}! Must be one of ${allRegions.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Checks if the given holidayName is a valid {@link HolidayType}.
|
||||||
|
* @param holidayName {@link HolidayType} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkHolidayType(holidayName) {
|
||||||
|
if (holidayName === null || holidayName === undefined) {
|
||||||
|
throw new TypeError('holidayName must not be null or undefined');
|
||||||
|
}
|
||||||
|
if (allHolidays.indexOf(holidayName) === -1) {
|
||||||
|
throw new Error(`feiertage.js: invalid holiday type "${holidayName}"! Must be one of ${allHolidays.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function isSpecificHoliday(date, holidayName, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
checkHolidayType(holidayName);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
const foundHoliday = holidays.find((holiday) => holiday.equals(date));
|
||||||
|
if (!foundHoliday) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return foundHoliday.name === holidayName;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns all holidays of a year in a {@link Region}.
|
||||||
|
* @param year
|
||||||
|
* @param region
|
||||||
|
* @returns {Array.<Holiday>}
|
||||||
|
*/
|
||||||
|
function getHolidays(year, region) {
|
||||||
|
let y;
|
||||||
|
if (typeof year === 'string') {
|
||||||
|
y = parseInt(year, 10);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
y = year;
|
||||||
|
}
|
||||||
|
checkRegion(region);
|
||||||
|
return getHolidaysOfYear(y, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {number[]}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysAsUtcTimestamps(year, region) {
|
||||||
|
const holidays = getHolidaysOfYear(year, region);
|
||||||
|
return holidays.map((holiday) => toUtcTimestamp(holiday.date));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {{objects: Array.<Holiday>, integers}}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysOfYear(year, region) {
|
||||||
|
const easterDate = getEasterDate(year);
|
||||||
|
const karfreitag = addDays(new Date(easterDate.getTime()), -2);
|
||||||
|
const ostermontag = addDays(new Date(easterDate.getTime()), 1);
|
||||||
|
const christiHimmelfahrt = addDays(new Date(easterDate.getTime()), 39);
|
||||||
|
const pfingstsonntag = addDays(new Date(easterDate.getTime()), 49);
|
||||||
|
const pfingstmontag = addDays(new Date(easterDate.getTime()), 50);
|
||||||
|
const holidays = [
|
||||||
|
...getCommonHolidays(year),
|
||||||
|
newHoliday('KARFREITAG', karfreitag),
|
||||||
|
newHoliday('OSTERMONTAG', ostermontag),
|
||||||
|
newHoliday('CHRISTIHIMMELFAHRT', christiHimmelfahrt),
|
||||||
|
newHoliday('PFINGSTMONTAG', pfingstmontag),
|
||||||
|
];
|
||||||
|
addHeiligeDreiKoenige(year, region, holidays);
|
||||||
|
addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, holidays);
|
||||||
|
addFronleichnam(region, easterDate, holidays);
|
||||||
|
addMariaeHimmelfahrt(year, region, holidays);
|
||||||
|
addReformationstag(year, region, holidays);
|
||||||
|
addAllerheiligen(year, region, holidays);
|
||||||
|
addBussUndBetttag(year, region, holidays);
|
||||||
|
addWeltkindertag(year, region, holidays);
|
||||||
|
addWeltfrauenTag(year, region, holidays);
|
||||||
|
addRegionalHolidays(year, region, holidays);
|
||||||
|
return holidays.sort((a, b) => a.date.getTime() - b.date.getTime());
|
||||||
|
}
|
||||||
|
function getCommonHolidays(year) {
|
||||||
|
return [
|
||||||
|
newHoliday('NEUJAHRSTAG', makeDate(year, 1, 1)),
|
||||||
|
newHoliday('TAG_DER_ARBEIT', makeDate(year, 5, 1)),
|
||||||
|
newHoliday('DEUTSCHEEINHEIT', makeDate(year, 10, 3)),
|
||||||
|
newHoliday('ERSTERWEIHNACHTSFEIERTAG', makeDate(year, 12, 25)),
|
||||||
|
newHoliday('ZWEITERWEIHNACHTSFEIERTAG', makeDate(year, 12, 26)),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
function addRegionalHolidays(year, region, feiertageObjects) {
|
||||||
|
if (region === 'AUGSBURG') {
|
||||||
|
feiertageObjects.push(newHoliday('AUGSBURGER_FRIEDENSFEST', makeDate(year, 8, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addHeiligeDreiKoenige(year, region, feiertageObjects) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('HEILIGEDREIKOENIGE', makeDate(year, 1, 6)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, feiertageObjects) {
|
||||||
|
if (region === 'BB' || region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('OSTERSONNTAG', easterDate), newHoliday('PFINGSTSONNTAG', pfingstsonntag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addFronleichnam(region, easterDate, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'HE' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
const fronleichnam = addDays(new Date(easterDate.getTime()), 60);
|
||||||
|
holidays.push(newHoliday('FRONLEICHNAM', fronleichnam));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addMariaeHimmelfahrt(year, region, holidays) {
|
||||||
|
if (region === 'SL' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('MARIAHIMMELFAHRT', makeDate(year, 8, 15)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addReformationstag(year, region, holidays) {
|
||||||
|
if (year === 2017 ||
|
||||||
|
region === 'NI' ||
|
||||||
|
region === 'BB' ||
|
||||||
|
region === 'HB' ||
|
||||||
|
region === 'HH' ||
|
||||||
|
region === 'MV' ||
|
||||||
|
region === 'SN' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'TH' ||
|
||||||
|
region === 'SH' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('REFORMATIONSTAG', makeDate(year, 10, 31)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addAllerheiligen(year, region, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('ALLERHEILIGEN', makeDate(year, 11, 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addBussUndBetttag(year, region, holidays) {
|
||||||
|
if (region === 'SN' || region === 'ALL') {
|
||||||
|
// @todo write test
|
||||||
|
const bussbettag = getBussBettag(year);
|
||||||
|
holidays.push(newHoliday('BUBETAG', makeDate(bussbettag.getUTCFullYear(), bussbettag.getUTCMonth() + 1, bussbettag.getUTCDate())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltkindertag(year, region, holidays) {
|
||||||
|
if (year >= 2019 && (region === 'TH' || region === 'ALL')) {
|
||||||
|
holidays.push(newHoliday('WELTKINDERTAG', makeDate(year, 9, 20)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltfrauenTag(year, region, feiertageObjects) {
|
||||||
|
if (year <= 2018) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (region === 'BE' || region === 'ALL') {
|
||||||
|
// in Berlin ist der Weltfrauentag ein Feiertag seit 2018
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
if (region === 'MV' && year >= 2023) {
|
||||||
|
// in MV wird der Weltfrauentag erst ab 2023 eingeführt
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Calculates the Easter date of a given year.
|
||||||
|
* @param year {number}
|
||||||
|
* @returns {Date} Easter date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getEasterDate(year) {
|
||||||
|
const C = Math.floor(year / 100);
|
||||||
|
// tslint:disable:binary-expression-operand-order
|
||||||
|
// tslint generates false positives in the following blocks
|
||||||
|
const N = year - 19 * Math.floor(year / 19);
|
||||||
|
const K = Math.floor((C - 17) / 25);
|
||||||
|
let I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;
|
||||||
|
I -= 30 * Math.floor(I / 30);
|
||||||
|
I -=
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
(1 -
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
Math.floor(29 / (I + 1)) *
|
||||||
|
Math.floor((21 - N) / 11));
|
||||||
|
let J = year + Math.floor(year / 4) + I + 2 - C + Math.floor(C / 4);
|
||||||
|
J -= 7 * Math.floor(J / 7);
|
||||||
|
const L = I - J;
|
||||||
|
const M = 3 + Math.floor((L + 40) / 44);
|
||||||
|
const D = L + 28 - 31 * Math.floor(M / 4);
|
||||||
|
// tslint:enable:binary-expression-operand-order
|
||||||
|
return new Date(year, M - 1, D);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Computes the "Buss- und Bettag"'s date.
|
||||||
|
* @param jahr {number}
|
||||||
|
* @returns {Date} the year's "Buss- und Bettag" date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getBussBettag(jahr) {
|
||||||
|
const weihnachten = new Date(jahr, 11, 25, 12, 0, 0);
|
||||||
|
const ersterAdventOffset = 32;
|
||||||
|
let wochenTagOffset = weihnachten.getDay() % 7;
|
||||||
|
if (wochenTagOffset === 0) {
|
||||||
|
wochenTagOffset = 7;
|
||||||
|
}
|
||||||
|
const tageVorWeihnachten = wochenTagOffset + ersterAdventOffset;
|
||||||
|
let bbtag = new Date(weihnachten.getTime());
|
||||||
|
bbtag = addDays(bbtag, -tageVorWeihnachten);
|
||||||
|
return bbtag;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Adds {@code days} days to the given {@link Date}.
|
||||||
|
* @param date
|
||||||
|
* @param days
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function addDays(date, days) {
|
||||||
|
const changedDate = new Date(date);
|
||||||
|
changedDate.setDate(date.getDate() + days);
|
||||||
|
return changedDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Date}.
|
||||||
|
* @param year
|
||||||
|
* @param naturalMonth month (1-12)
|
||||||
|
* @param day
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function makeDate(year, naturalMonth, day) {
|
||||||
|
return new Date(year, naturalMonth - 1, day);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param date
|
||||||
|
* @returns {Holiday}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function newHoliday(name, date) {
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
date,
|
||||||
|
dateString: localeDateObjectToDateString(date),
|
||||||
|
trans(lang = currentLanguage) {
|
||||||
|
console.warn('FeiertageJs: You are using "Holiday.trans() method. This will be replaced in the next major version with translate()"');
|
||||||
|
return this.translate(lang);
|
||||||
|
},
|
||||||
|
translate(lang = currentLanguage) {
|
||||||
|
return lang === undefined || lang === null
|
||||||
|
? undefined
|
||||||
|
: translations[lang][this.name];
|
||||||
|
},
|
||||||
|
getNormalizedDate() {
|
||||||
|
return toUtcTimestamp(this.date);
|
||||||
|
},
|
||||||
|
equals(otherDate) {
|
||||||
|
const dateString = localeDateObjectToDateString(otherDate);
|
||||||
|
return this.dateString === dateString;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @returns {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function localeDateObjectToDateString(date) {
|
||||||
|
const normalizedDate = new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000);
|
||||||
|
normalizedDate.setUTCHours(0, 0, 0, 0);
|
||||||
|
return normalizedDate.toISOString().slice(0, 10);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the UTC timestamp of the given date with hours, minutes, seconds, and milliseconds set to zero.
|
||||||
|
* @param date
|
||||||
|
* @returns {number} UTC timestamp
|
||||||
|
*/
|
||||||
|
function toUtcTimestamp(date) {
|
||||||
|
const internalDate = new Date(date);
|
||||||
|
internalDate.setHours(0, 0, 0, 0);
|
||||||
|
return internalDate.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
export { addTranslation, getHolidayByDate, getHolidays, getLanguage, isHoliday, isSpecificHoliday, isSunOrHoliday, setLanguage };
|
||||||
|
//# sourceMappingURL=feiertage.js.map
|
||||||
+1
File diff suppressed because one or more lines are too long
+496
@@ -0,0 +1,496 @@
|
|||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
||||||
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
||||||
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
|
||||||
|
var current = global.feiertagejs;
|
||||||
|
var exports = global.feiertagejs = {};
|
||||||
|
factory(exports);
|
||||||
|
exports.noConflict = function () { global.feiertagejs = current; return exports; };
|
||||||
|
})());
|
||||||
|
})(this, (function (exports) { 'use strict';
|
||||||
|
|
||||||
|
const germanTranslations = {
|
||||||
|
NEUJAHRSTAG: 'Neujahrstag',
|
||||||
|
HEILIGEDREIKOENIGE: 'Heilige Drei Könige',
|
||||||
|
KARFREITAG: 'Karfreitag',
|
||||||
|
OSTERSONNTAG: 'Ostersonntag',
|
||||||
|
OSTERMONTAG: 'Ostermontag',
|
||||||
|
TAG_DER_ARBEIT: 'Tag der Arbeit',
|
||||||
|
CHRISTIHIMMELFAHRT: 'Christi Himmelfahrt',
|
||||||
|
PFINGSTSONNTAG: 'Pfingstsonntag',
|
||||||
|
PFINGSTMONTAG: 'Pfingstmontag',
|
||||||
|
FRONLEICHNAM: 'Fronleichnam',
|
||||||
|
MARIAHIMMELFAHRT: 'Mariä Himmelfahrt',
|
||||||
|
DEUTSCHEEINHEIT: 'Tag der Deutschen Einheit',
|
||||||
|
REFORMATIONSTAG: 'Reformationstag',
|
||||||
|
ALLERHEILIGEN: 'Allerheiligen',
|
||||||
|
BUBETAG: 'Buß- und Bettag',
|
||||||
|
ERSTERWEIHNACHTSFEIERTAG: '1. Weihnachtstag',
|
||||||
|
ZWEITERWEIHNACHTSFEIERTAG: '2. Weihnachtstag',
|
||||||
|
WELTKINDERTAG: 'Weltkindertag',
|
||||||
|
WELTFRAUENTAG: 'Weltfrauentag',
|
||||||
|
AUGSBURGER_FRIEDENSFEST: 'Augsburger Friedensfest',
|
||||||
|
};
|
||||||
|
|
||||||
|
const allHolidays = [
|
||||||
|
'NEUJAHRSTAG',
|
||||||
|
'HEILIGEDREIKOENIGE',
|
||||||
|
'KARFREITAG',
|
||||||
|
'OSTERSONNTAG',
|
||||||
|
'OSTERMONTAG',
|
||||||
|
'TAG_DER_ARBEIT',
|
||||||
|
'CHRISTIHIMMELFAHRT',
|
||||||
|
'MARIAHIMMELFAHRT',
|
||||||
|
'PFINGSTSONNTAG',
|
||||||
|
'PFINGSTMONTAG',
|
||||||
|
'FRONLEICHNAM',
|
||||||
|
'DEUTSCHEEINHEIT',
|
||||||
|
'REFORMATIONSTAG',
|
||||||
|
'ALLERHEILIGEN',
|
||||||
|
'BUBETAG',
|
||||||
|
'ERSTERWEIHNACHTSFEIERTAG',
|
||||||
|
'ZWEITERWEIHNACHTSFEIERTAG',
|
||||||
|
'WELTKINDERTAG',
|
||||||
|
'WELTFRAUENTAG',
|
||||||
|
'AUGSBURGER_FRIEDENSFEST',
|
||||||
|
];
|
||||||
|
|
||||||
|
const allRegions = [
|
||||||
|
'BW',
|
||||||
|
'BY',
|
||||||
|
'BE',
|
||||||
|
'BB',
|
||||||
|
'HB',
|
||||||
|
'HE',
|
||||||
|
'HH',
|
||||||
|
'MV',
|
||||||
|
'NI',
|
||||||
|
'NW',
|
||||||
|
'RP',
|
||||||
|
'SL',
|
||||||
|
'SN',
|
||||||
|
'ST',
|
||||||
|
'SH',
|
||||||
|
'TH',
|
||||||
|
'BUND',
|
||||||
|
'AUGSBURG',
|
||||||
|
'ALL',
|
||||||
|
];
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* feiertage.js
|
||||||
|
* @repository https://github.com/sfakir/feiertagejs
|
||||||
|
* @docs https://github.com/sfakir/feiertagejs/blob/master/docs.md
|
||||||
|
*
|
||||||
|
* Copyright 2015-2021 Simon Fakir
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
// translations
|
||||||
|
const defaultLanguage = 'de';
|
||||||
|
let currentLanguage = defaultLanguage;
|
||||||
|
const translations = {
|
||||||
|
de: germanTranslations,
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* adds a translation for the holidays (e.g. english).
|
||||||
|
* This also allows to override the German names.
|
||||||
|
* Hint: Interpolates German for missing translations
|
||||||
|
* @param {string} isoCode of the new language
|
||||||
|
* @param {TranslationTable} newTranslation map of {HolidayType} to translation stringg
|
||||||
|
*/
|
||||||
|
function addTranslation(isoCode, newTranslation) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
const defaultTranslation = translations[defaultLanguage];
|
||||||
|
let missingFields = false;
|
||||||
|
// fill new Translation with default Language
|
||||||
|
for (const holiday of allHolidays) {
|
||||||
|
if (!newTranslation[holiday]) {
|
||||||
|
missingFields = true;
|
||||||
|
newTranslation[holiday] = defaultTranslation[holiday];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (missingFields) {
|
||||||
|
console.warn('[feiertagejs] addTranslation: you did not add all holidays in your translation! Took German as fallback');
|
||||||
|
}
|
||||||
|
translations[code] = newTranslation;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a language to default language
|
||||||
|
* @param {string} isoCode
|
||||||
|
*/
|
||||||
|
function setLanguage(isoCode) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
if (!translations[code]) {
|
||||||
|
throw new TypeError(`[feiertagejs] tried to set language to ${code} but the translation is missing. Please use addTranslation(isoCode,object) first`);
|
||||||
|
}
|
||||||
|
currentLanguage = isoCode;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get currently set language
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
function getLanguage() {
|
||||||
|
return currentLanguage;
|
||||||
|
}
|
||||||
|
// holidays api
|
||||||
|
/**
|
||||||
|
* Checks if a specific date is sunday or holiday.
|
||||||
|
* @param date
|
||||||
|
* @param region
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isSunOrHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
return date.getDay() === 0 || isHoliday(date, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Check is specific date is holiday.
|
||||||
|
* @param date
|
||||||
|
* @param {Region} region two character {@link Region} code
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const internalDate = toUtcTimestamp(date);
|
||||||
|
const holidays = getHolidaysAsUtcTimestamps(year, region);
|
||||||
|
return holidays.indexOf(internalDate) !== -1;
|
||||||
|
}
|
||||||
|
function getHolidayByDate(date, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
return holidays.find((holiday) => holiday.equals(date));
|
||||||
|
}
|
||||||
|
// additional runtime checks
|
||||||
|
/**
|
||||||
|
* Checks if the given region is a valid {@link Region}.
|
||||||
|
*
|
||||||
|
* @param region {@link Region} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkRegion(region) {
|
||||||
|
if (region === null || region === undefined) {
|
||||||
|
throw new Error(`Region must not be undefined or null`);
|
||||||
|
}
|
||||||
|
if (allRegions.indexOf(region) === -1) {
|
||||||
|
throw new Error(`Invalid region: ${region}! Must be one of ${allRegions.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Checks if the given holidayName is a valid {@link HolidayType}.
|
||||||
|
* @param holidayName {@link HolidayType} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkHolidayType(holidayName) {
|
||||||
|
if (holidayName === null || holidayName === undefined) {
|
||||||
|
throw new TypeError('holidayName must not be null or undefined');
|
||||||
|
}
|
||||||
|
if (allHolidays.indexOf(holidayName) === -1) {
|
||||||
|
throw new Error(`feiertage.js: invalid holiday type "${holidayName}"! Must be one of ${allHolidays.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function isSpecificHoliday(date, holidayName, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
checkHolidayType(holidayName);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
const foundHoliday = holidays.find((holiday) => holiday.equals(date));
|
||||||
|
if (!foundHoliday) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return foundHoliday.name === holidayName;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns all holidays of a year in a {@link Region}.
|
||||||
|
* @param year
|
||||||
|
* @param region
|
||||||
|
* @returns {Array.<Holiday>}
|
||||||
|
*/
|
||||||
|
function getHolidays(year, region) {
|
||||||
|
let y;
|
||||||
|
if (typeof year === 'string') {
|
||||||
|
y = parseInt(year, 10);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
y = year;
|
||||||
|
}
|
||||||
|
checkRegion(region);
|
||||||
|
return getHolidaysOfYear(y, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {number[]}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysAsUtcTimestamps(year, region) {
|
||||||
|
const holidays = getHolidaysOfYear(year, region);
|
||||||
|
return holidays.map((holiday) => toUtcTimestamp(holiday.date));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {{objects: Array.<Holiday>, integers}}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysOfYear(year, region) {
|
||||||
|
const easterDate = getEasterDate(year);
|
||||||
|
const karfreitag = addDays(new Date(easterDate.getTime()), -2);
|
||||||
|
const ostermontag = addDays(new Date(easterDate.getTime()), 1);
|
||||||
|
const christiHimmelfahrt = addDays(new Date(easterDate.getTime()), 39);
|
||||||
|
const pfingstsonntag = addDays(new Date(easterDate.getTime()), 49);
|
||||||
|
const pfingstmontag = addDays(new Date(easterDate.getTime()), 50);
|
||||||
|
const holidays = [
|
||||||
|
...getCommonHolidays(year),
|
||||||
|
newHoliday('KARFREITAG', karfreitag),
|
||||||
|
newHoliday('OSTERMONTAG', ostermontag),
|
||||||
|
newHoliday('CHRISTIHIMMELFAHRT', christiHimmelfahrt),
|
||||||
|
newHoliday('PFINGSTMONTAG', pfingstmontag),
|
||||||
|
];
|
||||||
|
addHeiligeDreiKoenige(year, region, holidays);
|
||||||
|
addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, holidays);
|
||||||
|
addFronleichnam(region, easterDate, holidays);
|
||||||
|
addMariaeHimmelfahrt(year, region, holidays);
|
||||||
|
addReformationstag(year, region, holidays);
|
||||||
|
addAllerheiligen(year, region, holidays);
|
||||||
|
addBussUndBetttag(year, region, holidays);
|
||||||
|
addWeltkindertag(year, region, holidays);
|
||||||
|
addWeltfrauenTag(year, region, holidays);
|
||||||
|
addRegionalHolidays(year, region, holidays);
|
||||||
|
return holidays.sort((a, b) => a.date.getTime() - b.date.getTime());
|
||||||
|
}
|
||||||
|
function getCommonHolidays(year) {
|
||||||
|
return [
|
||||||
|
newHoliday('NEUJAHRSTAG', makeDate(year, 1, 1)),
|
||||||
|
newHoliday('TAG_DER_ARBEIT', makeDate(year, 5, 1)),
|
||||||
|
newHoliday('DEUTSCHEEINHEIT', makeDate(year, 10, 3)),
|
||||||
|
newHoliday('ERSTERWEIHNACHTSFEIERTAG', makeDate(year, 12, 25)),
|
||||||
|
newHoliday('ZWEITERWEIHNACHTSFEIERTAG', makeDate(year, 12, 26)),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
function addRegionalHolidays(year, region, feiertageObjects) {
|
||||||
|
if (region === 'AUGSBURG') {
|
||||||
|
feiertageObjects.push(newHoliday('AUGSBURGER_FRIEDENSFEST', makeDate(year, 8, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addHeiligeDreiKoenige(year, region, feiertageObjects) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('HEILIGEDREIKOENIGE', makeDate(year, 1, 6)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, feiertageObjects) {
|
||||||
|
if (region === 'BB' || region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('OSTERSONNTAG', easterDate), newHoliday('PFINGSTSONNTAG', pfingstsonntag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addFronleichnam(region, easterDate, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'HE' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
const fronleichnam = addDays(new Date(easterDate.getTime()), 60);
|
||||||
|
holidays.push(newHoliday('FRONLEICHNAM', fronleichnam));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addMariaeHimmelfahrt(year, region, holidays) {
|
||||||
|
if (region === 'SL' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('MARIAHIMMELFAHRT', makeDate(year, 8, 15)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addReformationstag(year, region, holidays) {
|
||||||
|
if (year === 2017 ||
|
||||||
|
region === 'NI' ||
|
||||||
|
region === 'BB' ||
|
||||||
|
region === 'HB' ||
|
||||||
|
region === 'HH' ||
|
||||||
|
region === 'MV' ||
|
||||||
|
region === 'SN' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'TH' ||
|
||||||
|
region === 'SH' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('REFORMATIONSTAG', makeDate(year, 10, 31)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addAllerheiligen(year, region, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('ALLERHEILIGEN', makeDate(year, 11, 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addBussUndBetttag(year, region, holidays) {
|
||||||
|
if (region === 'SN' || region === 'ALL') {
|
||||||
|
// @todo write test
|
||||||
|
const bussbettag = getBussBettag(year);
|
||||||
|
holidays.push(newHoliday('BUBETAG', makeDate(bussbettag.getUTCFullYear(), bussbettag.getUTCMonth() + 1, bussbettag.getUTCDate())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltkindertag(year, region, holidays) {
|
||||||
|
if (year >= 2019 && (region === 'TH' || region === 'ALL')) {
|
||||||
|
holidays.push(newHoliday('WELTKINDERTAG', makeDate(year, 9, 20)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltfrauenTag(year, region, feiertageObjects) {
|
||||||
|
if (year <= 2018) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (region === 'BE' || region === 'ALL') {
|
||||||
|
// in Berlin ist der Weltfrauentag ein Feiertag seit 2018
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
if (region === 'MV' && year >= 2023) {
|
||||||
|
// in MV wird der Weltfrauentag erst ab 2023 eingeführt
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Calculates the Easter date of a given year.
|
||||||
|
* @param year {number}
|
||||||
|
* @returns {Date} Easter date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getEasterDate(year) {
|
||||||
|
const C = Math.floor(year / 100);
|
||||||
|
// tslint:disable:binary-expression-operand-order
|
||||||
|
// tslint generates false positives in the following blocks
|
||||||
|
const N = year - 19 * Math.floor(year / 19);
|
||||||
|
const K = Math.floor((C - 17) / 25);
|
||||||
|
let I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;
|
||||||
|
I -= 30 * Math.floor(I / 30);
|
||||||
|
I -=
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
(1 -
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
Math.floor(29 / (I + 1)) *
|
||||||
|
Math.floor((21 - N) / 11));
|
||||||
|
let J = year + Math.floor(year / 4) + I + 2 - C + Math.floor(C / 4);
|
||||||
|
J -= 7 * Math.floor(J / 7);
|
||||||
|
const L = I - J;
|
||||||
|
const M = 3 + Math.floor((L + 40) / 44);
|
||||||
|
const D = L + 28 - 31 * Math.floor(M / 4);
|
||||||
|
// tslint:enable:binary-expression-operand-order
|
||||||
|
return new Date(year, M - 1, D);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Computes the "Buss- und Bettag"'s date.
|
||||||
|
* @param jahr {number}
|
||||||
|
* @returns {Date} the year's "Buss- und Bettag" date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getBussBettag(jahr) {
|
||||||
|
const weihnachten = new Date(jahr, 11, 25, 12, 0, 0);
|
||||||
|
const ersterAdventOffset = 32;
|
||||||
|
let wochenTagOffset = weihnachten.getDay() % 7;
|
||||||
|
if (wochenTagOffset === 0) {
|
||||||
|
wochenTagOffset = 7;
|
||||||
|
}
|
||||||
|
const tageVorWeihnachten = wochenTagOffset + ersterAdventOffset;
|
||||||
|
let bbtag = new Date(weihnachten.getTime());
|
||||||
|
bbtag = addDays(bbtag, -tageVorWeihnachten);
|
||||||
|
return bbtag;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Adds {@code days} days to the given {@link Date}.
|
||||||
|
* @param date
|
||||||
|
* @param days
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function addDays(date, days) {
|
||||||
|
const changedDate = new Date(date);
|
||||||
|
changedDate.setDate(date.getDate() + days);
|
||||||
|
return changedDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Date}.
|
||||||
|
* @param year
|
||||||
|
* @param naturalMonth month (1-12)
|
||||||
|
* @param day
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function makeDate(year, naturalMonth, day) {
|
||||||
|
return new Date(year, naturalMonth - 1, day);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param date
|
||||||
|
* @returns {Holiday}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function newHoliday(name, date) {
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
date,
|
||||||
|
dateString: localeDateObjectToDateString(date),
|
||||||
|
trans(lang = currentLanguage) {
|
||||||
|
console.warn('FeiertageJs: You are using "Holiday.trans() method. This will be replaced in the next major version with translate()"');
|
||||||
|
return this.translate(lang);
|
||||||
|
},
|
||||||
|
translate(lang = currentLanguage) {
|
||||||
|
return lang === undefined || lang === null
|
||||||
|
? undefined
|
||||||
|
: translations[lang][this.name];
|
||||||
|
},
|
||||||
|
getNormalizedDate() {
|
||||||
|
return toUtcTimestamp(this.date);
|
||||||
|
},
|
||||||
|
equals(otherDate) {
|
||||||
|
const dateString = localeDateObjectToDateString(otherDate);
|
||||||
|
return this.dateString === dateString;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @returns {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function localeDateObjectToDateString(date) {
|
||||||
|
const normalizedDate = new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000);
|
||||||
|
normalizedDate.setUTCHours(0, 0, 0, 0);
|
||||||
|
return normalizedDate.toISOString().slice(0, 10);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the UTC timestamp of the given date with hours, minutes, seconds, and milliseconds set to zero.
|
||||||
|
* @param date
|
||||||
|
* @returns {number} UTC timestamp
|
||||||
|
*/
|
||||||
|
function toUtcTimestamp(date) {
|
||||||
|
const internalDate = new Date(date);
|
||||||
|
internalDate.setHours(0, 0, 0, 0);
|
||||||
|
return internalDate.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.addTranslation = addTranslation;
|
||||||
|
exports.getHolidayByDate = getHolidayByDate;
|
||||||
|
exports.getHolidays = getHolidays;
|
||||||
|
exports.getLanguage = getLanguage;
|
||||||
|
exports.isHoliday = isHoliday;
|
||||||
|
exports.isSpecificHoliday = isSpecificHoliday;
|
||||||
|
exports.isSunOrHoliday = isSunOrHoliday;
|
||||||
|
exports.setLanguage = setLanguage;
|
||||||
|
|
||||||
|
}));
|
||||||
|
//# sourceMappingURL=feiertage.umd.cjs.map
|
||||||
+1
File diff suppressed because one or more lines are too long
+496
@@ -0,0 +1,496 @@
|
|||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
||||||
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
||||||
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
|
||||||
|
var current = global.feiertagejs;
|
||||||
|
var exports = global.feiertagejs = {};
|
||||||
|
factory(exports);
|
||||||
|
exports.noConflict = function () { global.feiertagejs = current; return exports; };
|
||||||
|
})());
|
||||||
|
})(this, (function (exports) { 'use strict';
|
||||||
|
|
||||||
|
const germanTranslations = {
|
||||||
|
NEUJAHRSTAG: 'Neujahrstag',
|
||||||
|
HEILIGEDREIKOENIGE: 'Heilige Drei Könige',
|
||||||
|
KARFREITAG: 'Karfreitag',
|
||||||
|
OSTERSONNTAG: 'Ostersonntag',
|
||||||
|
OSTERMONTAG: 'Ostermontag',
|
||||||
|
TAG_DER_ARBEIT: 'Tag der Arbeit',
|
||||||
|
CHRISTIHIMMELFAHRT: 'Christi Himmelfahrt',
|
||||||
|
PFINGSTSONNTAG: 'Pfingstsonntag',
|
||||||
|
PFINGSTMONTAG: 'Pfingstmontag',
|
||||||
|
FRONLEICHNAM: 'Fronleichnam',
|
||||||
|
MARIAHIMMELFAHRT: 'Mariä Himmelfahrt',
|
||||||
|
DEUTSCHEEINHEIT: 'Tag der Deutschen Einheit',
|
||||||
|
REFORMATIONSTAG: 'Reformationstag',
|
||||||
|
ALLERHEILIGEN: 'Allerheiligen',
|
||||||
|
BUBETAG: 'Buß- und Bettag',
|
||||||
|
ERSTERWEIHNACHTSFEIERTAG: '1. Weihnachtstag',
|
||||||
|
ZWEITERWEIHNACHTSFEIERTAG: '2. Weihnachtstag',
|
||||||
|
WELTKINDERTAG: 'Weltkindertag',
|
||||||
|
WELTFRAUENTAG: 'Weltfrauentag',
|
||||||
|
AUGSBURGER_FRIEDENSFEST: 'Augsburger Friedensfest',
|
||||||
|
};
|
||||||
|
|
||||||
|
const allHolidays = [
|
||||||
|
'NEUJAHRSTAG',
|
||||||
|
'HEILIGEDREIKOENIGE',
|
||||||
|
'KARFREITAG',
|
||||||
|
'OSTERSONNTAG',
|
||||||
|
'OSTERMONTAG',
|
||||||
|
'TAG_DER_ARBEIT',
|
||||||
|
'CHRISTIHIMMELFAHRT',
|
||||||
|
'MARIAHIMMELFAHRT',
|
||||||
|
'PFINGSTSONNTAG',
|
||||||
|
'PFINGSTMONTAG',
|
||||||
|
'FRONLEICHNAM',
|
||||||
|
'DEUTSCHEEINHEIT',
|
||||||
|
'REFORMATIONSTAG',
|
||||||
|
'ALLERHEILIGEN',
|
||||||
|
'BUBETAG',
|
||||||
|
'ERSTERWEIHNACHTSFEIERTAG',
|
||||||
|
'ZWEITERWEIHNACHTSFEIERTAG',
|
||||||
|
'WELTKINDERTAG',
|
||||||
|
'WELTFRAUENTAG',
|
||||||
|
'AUGSBURGER_FRIEDENSFEST',
|
||||||
|
];
|
||||||
|
|
||||||
|
const allRegions = [
|
||||||
|
'BW',
|
||||||
|
'BY',
|
||||||
|
'BE',
|
||||||
|
'BB',
|
||||||
|
'HB',
|
||||||
|
'HE',
|
||||||
|
'HH',
|
||||||
|
'MV',
|
||||||
|
'NI',
|
||||||
|
'NW',
|
||||||
|
'RP',
|
||||||
|
'SL',
|
||||||
|
'SN',
|
||||||
|
'ST',
|
||||||
|
'SH',
|
||||||
|
'TH',
|
||||||
|
'BUND',
|
||||||
|
'AUGSBURG',
|
||||||
|
'ALL',
|
||||||
|
];
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* feiertage.js
|
||||||
|
* @repository https://github.com/sfakir/feiertagejs
|
||||||
|
* @docs https://github.com/sfakir/feiertagejs/blob/master/docs.md
|
||||||
|
*
|
||||||
|
* Copyright 2015-2021 Simon Fakir
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
// translations
|
||||||
|
const defaultLanguage = 'de';
|
||||||
|
let currentLanguage = defaultLanguage;
|
||||||
|
const translations = {
|
||||||
|
de: germanTranslations,
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* adds a translation for the holidays (e.g. english).
|
||||||
|
* This also allows to override the German names.
|
||||||
|
* Hint: Interpolates German for missing translations
|
||||||
|
* @param {string} isoCode of the new language
|
||||||
|
* @param {TranslationTable} newTranslation map of {HolidayType} to translation stringg
|
||||||
|
*/
|
||||||
|
function addTranslation(isoCode, newTranslation) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
const defaultTranslation = translations[defaultLanguage];
|
||||||
|
let missingFields = false;
|
||||||
|
// fill new Translation with default Language
|
||||||
|
for (const holiday of allHolidays) {
|
||||||
|
if (!newTranslation[holiday]) {
|
||||||
|
missingFields = true;
|
||||||
|
newTranslation[holiday] = defaultTranslation[holiday];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (missingFields) {
|
||||||
|
console.warn('[feiertagejs] addTranslation: you did not add all holidays in your translation! Took German as fallback');
|
||||||
|
}
|
||||||
|
translations[code] = newTranslation;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a language to default language
|
||||||
|
* @param {string} isoCode
|
||||||
|
*/
|
||||||
|
function setLanguage(isoCode) {
|
||||||
|
const code = isoCode.toLowerCase();
|
||||||
|
if (!translations[code]) {
|
||||||
|
throw new TypeError(`[feiertagejs] tried to set language to ${code} but the translation is missing. Please use addTranslation(isoCode,object) first`);
|
||||||
|
}
|
||||||
|
currentLanguage = isoCode;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get currently set language
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
function getLanguage() {
|
||||||
|
return currentLanguage;
|
||||||
|
}
|
||||||
|
// holidays api
|
||||||
|
/**
|
||||||
|
* Checks if a specific date is sunday or holiday.
|
||||||
|
* @param date
|
||||||
|
* @param region
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isSunOrHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
return date.getDay() === 0 || isHoliday(date, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Check is specific date is holiday.
|
||||||
|
* @param date
|
||||||
|
* @param {Region} region two character {@link Region} code
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isHoliday(date, region) {
|
||||||
|
checkRegion(region);
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const internalDate = toUtcTimestamp(date);
|
||||||
|
const holidays = getHolidaysAsUtcTimestamps(year, region);
|
||||||
|
return holidays.indexOf(internalDate) !== -1;
|
||||||
|
}
|
||||||
|
function getHolidayByDate(date, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
return holidays.find((holiday) => holiday.equals(date));
|
||||||
|
}
|
||||||
|
// additional runtime checks
|
||||||
|
/**
|
||||||
|
* Checks if the given region is a valid {@link Region}.
|
||||||
|
*
|
||||||
|
* @param region {@link Region} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkRegion(region) {
|
||||||
|
if (region === null || region === undefined) {
|
||||||
|
throw new Error(`Region must not be undefined or null`);
|
||||||
|
}
|
||||||
|
if (allRegions.indexOf(region) === -1) {
|
||||||
|
throw new Error(`Invalid region: ${region}! Must be one of ${allRegions.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Checks if the given holidayName is a valid {@link HolidayType}.
|
||||||
|
* @param holidayName {@link HolidayType} to check
|
||||||
|
* @throws {Error}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function checkHolidayType(holidayName) {
|
||||||
|
if (holidayName === null || holidayName === undefined) {
|
||||||
|
throw new TypeError('holidayName must not be null or undefined');
|
||||||
|
}
|
||||||
|
if (allHolidays.indexOf(holidayName) === -1) {
|
||||||
|
throw new Error(`feiertage.js: invalid holiday type "${holidayName}"! Must be one of ${allHolidays.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function isSpecificHoliday(date, holidayName, region = 'ALL') {
|
||||||
|
checkRegion(region);
|
||||||
|
checkHolidayType(holidayName);
|
||||||
|
const holidays = getHolidaysOfYear(date.getFullYear(), region);
|
||||||
|
const foundHoliday = holidays.find((holiday) => holiday.equals(date));
|
||||||
|
if (!foundHoliday) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return foundHoliday.name === holidayName;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns all holidays of a year in a {@link Region}.
|
||||||
|
* @param year
|
||||||
|
* @param region
|
||||||
|
* @returns {Array.<Holiday>}
|
||||||
|
*/
|
||||||
|
function getHolidays(year, region) {
|
||||||
|
let y;
|
||||||
|
if (typeof year === 'string') {
|
||||||
|
y = parseInt(year, 10);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
y = year;
|
||||||
|
}
|
||||||
|
checkRegion(region);
|
||||||
|
return getHolidaysOfYear(y, region);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {number[]}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysAsUtcTimestamps(year, region) {
|
||||||
|
const holidays = getHolidaysOfYear(year, region);
|
||||||
|
return holidays.map((holiday) => toUtcTimestamp(holiday.date));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} year
|
||||||
|
* @param region
|
||||||
|
* @returns {{objects: Array.<Holiday>, integers}}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getHolidaysOfYear(year, region) {
|
||||||
|
const easterDate = getEasterDate(year);
|
||||||
|
const karfreitag = addDays(new Date(easterDate.getTime()), -2);
|
||||||
|
const ostermontag = addDays(new Date(easterDate.getTime()), 1);
|
||||||
|
const christiHimmelfahrt = addDays(new Date(easterDate.getTime()), 39);
|
||||||
|
const pfingstsonntag = addDays(new Date(easterDate.getTime()), 49);
|
||||||
|
const pfingstmontag = addDays(new Date(easterDate.getTime()), 50);
|
||||||
|
const holidays = [
|
||||||
|
...getCommonHolidays(year),
|
||||||
|
newHoliday('KARFREITAG', karfreitag),
|
||||||
|
newHoliday('OSTERMONTAG', ostermontag),
|
||||||
|
newHoliday('CHRISTIHIMMELFAHRT', christiHimmelfahrt),
|
||||||
|
newHoliday('PFINGSTMONTAG', pfingstmontag),
|
||||||
|
];
|
||||||
|
addHeiligeDreiKoenige(year, region, holidays);
|
||||||
|
addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, holidays);
|
||||||
|
addFronleichnam(region, easterDate, holidays);
|
||||||
|
addMariaeHimmelfahrt(year, region, holidays);
|
||||||
|
addReformationstag(year, region, holidays);
|
||||||
|
addAllerheiligen(year, region, holidays);
|
||||||
|
addBussUndBetttag(year, region, holidays);
|
||||||
|
addWeltkindertag(year, region, holidays);
|
||||||
|
addWeltfrauenTag(year, region, holidays);
|
||||||
|
addRegionalHolidays(year, region, holidays);
|
||||||
|
return holidays.sort((a, b) => a.date.getTime() - b.date.getTime());
|
||||||
|
}
|
||||||
|
function getCommonHolidays(year) {
|
||||||
|
return [
|
||||||
|
newHoliday('NEUJAHRSTAG', makeDate(year, 1, 1)),
|
||||||
|
newHoliday('TAG_DER_ARBEIT', makeDate(year, 5, 1)),
|
||||||
|
newHoliday('DEUTSCHEEINHEIT', makeDate(year, 10, 3)),
|
||||||
|
newHoliday('ERSTERWEIHNACHTSFEIERTAG', makeDate(year, 12, 25)),
|
||||||
|
newHoliday('ZWEITERWEIHNACHTSFEIERTAG', makeDate(year, 12, 26)),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
function addRegionalHolidays(year, region, feiertageObjects) {
|
||||||
|
if (region === 'AUGSBURG') {
|
||||||
|
feiertageObjects.push(newHoliday('AUGSBURGER_FRIEDENSFEST', makeDate(year, 8, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addHeiligeDreiKoenige(year, region, feiertageObjects) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('HEILIGEDREIKOENIGE', makeDate(year, 1, 6)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, feiertageObjects) {
|
||||||
|
if (region === 'BB' || region === 'ALL') {
|
||||||
|
feiertageObjects.push(newHoliday('OSTERSONNTAG', easterDate), newHoliday('PFINGSTSONNTAG', pfingstsonntag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addFronleichnam(region, easterDate, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'HE' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
const fronleichnam = addDays(new Date(easterDate.getTime()), 60);
|
||||||
|
holidays.push(newHoliday('FRONLEICHNAM', fronleichnam));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addMariaeHimmelfahrt(year, region, holidays) {
|
||||||
|
if (region === 'SL' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('MARIAHIMMELFAHRT', makeDate(year, 8, 15)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addReformationstag(year, region, holidays) {
|
||||||
|
if (year === 2017 ||
|
||||||
|
region === 'NI' ||
|
||||||
|
region === 'BB' ||
|
||||||
|
region === 'HB' ||
|
||||||
|
region === 'HH' ||
|
||||||
|
region === 'MV' ||
|
||||||
|
region === 'SN' ||
|
||||||
|
region === 'ST' ||
|
||||||
|
region === 'TH' ||
|
||||||
|
region === 'SH' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('REFORMATIONSTAG', makeDate(year, 10, 31)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addAllerheiligen(year, region, holidays) {
|
||||||
|
if (region === 'BW' ||
|
||||||
|
region === 'BY' ||
|
||||||
|
region === 'AUGSBURG' ||
|
||||||
|
region === 'NW' ||
|
||||||
|
region === 'RP' ||
|
||||||
|
region === 'SL' ||
|
||||||
|
region === 'ALL') {
|
||||||
|
holidays.push(newHoliday('ALLERHEILIGEN', makeDate(year, 11, 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addBussUndBetttag(year, region, holidays) {
|
||||||
|
if (region === 'SN' || region === 'ALL') {
|
||||||
|
// @todo write test
|
||||||
|
const bussbettag = getBussBettag(year);
|
||||||
|
holidays.push(newHoliday('BUBETAG', makeDate(bussbettag.getUTCFullYear(), bussbettag.getUTCMonth() + 1, bussbettag.getUTCDate())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltkindertag(year, region, holidays) {
|
||||||
|
if (year >= 2019 && (region === 'TH' || region === 'ALL')) {
|
||||||
|
holidays.push(newHoliday('WELTKINDERTAG', makeDate(year, 9, 20)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addWeltfrauenTag(year, region, feiertageObjects) {
|
||||||
|
if (year <= 2018) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (region === 'BE' || region === 'ALL') {
|
||||||
|
// in Berlin ist der Weltfrauentag ein Feiertag seit 2018
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
if (region === 'MV' && year >= 2023) {
|
||||||
|
// in MV wird der Weltfrauentag erst ab 2023 eingeführt
|
||||||
|
feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Calculates the Easter date of a given year.
|
||||||
|
* @param year {number}
|
||||||
|
* @returns {Date} Easter date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getEasterDate(year) {
|
||||||
|
const C = Math.floor(year / 100);
|
||||||
|
// tslint:disable:binary-expression-operand-order
|
||||||
|
// tslint generates false positives in the following blocks
|
||||||
|
const N = year - 19 * Math.floor(year / 19);
|
||||||
|
const K = Math.floor((C - 17) / 25);
|
||||||
|
let I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;
|
||||||
|
I -= 30 * Math.floor(I / 30);
|
||||||
|
I -=
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
(1 -
|
||||||
|
Math.floor(I / 28) *
|
||||||
|
Math.floor(29 / (I + 1)) *
|
||||||
|
Math.floor((21 - N) / 11));
|
||||||
|
let J = year + Math.floor(year / 4) + I + 2 - C + Math.floor(C / 4);
|
||||||
|
J -= 7 * Math.floor(J / 7);
|
||||||
|
const L = I - J;
|
||||||
|
const M = 3 + Math.floor((L + 40) / 44);
|
||||||
|
const D = L + 28 - 31 * Math.floor(M / 4);
|
||||||
|
// tslint:enable:binary-expression-operand-order
|
||||||
|
return new Date(year, M - 1, D);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Computes the "Buss- und Bettag"'s date.
|
||||||
|
* @param jahr {number}
|
||||||
|
* @returns {Date} the year's "Buss- und Bettag" date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getBussBettag(jahr) {
|
||||||
|
const weihnachten = new Date(jahr, 11, 25, 12, 0, 0);
|
||||||
|
const ersterAdventOffset = 32;
|
||||||
|
let wochenTagOffset = weihnachten.getDay() % 7;
|
||||||
|
if (wochenTagOffset === 0) {
|
||||||
|
wochenTagOffset = 7;
|
||||||
|
}
|
||||||
|
const tageVorWeihnachten = wochenTagOffset + ersterAdventOffset;
|
||||||
|
let bbtag = new Date(weihnachten.getTime());
|
||||||
|
bbtag = addDays(bbtag, -tageVorWeihnachten);
|
||||||
|
return bbtag;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Adds {@code days} days to the given {@link Date}.
|
||||||
|
* @param date
|
||||||
|
* @param days
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function addDays(date, days) {
|
||||||
|
const changedDate = new Date(date);
|
||||||
|
changedDate.setDate(date.getDate() + days);
|
||||||
|
return changedDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Date}.
|
||||||
|
* @param year
|
||||||
|
* @param naturalMonth month (1-12)
|
||||||
|
* @param day
|
||||||
|
* @returns {Date}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function makeDate(year, naturalMonth, day) {
|
||||||
|
return new Date(year, naturalMonth - 1, day);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param date
|
||||||
|
* @returns {Holiday}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function newHoliday(name, date) {
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
date,
|
||||||
|
dateString: localeDateObjectToDateString(date),
|
||||||
|
trans(lang = currentLanguage) {
|
||||||
|
console.warn('FeiertageJs: You are using "Holiday.trans() method. This will be replaced in the next major version with translate()"');
|
||||||
|
return this.translate(lang);
|
||||||
|
},
|
||||||
|
translate(lang = currentLanguage) {
|
||||||
|
return lang === undefined || lang === null
|
||||||
|
? undefined
|
||||||
|
: translations[lang][this.name];
|
||||||
|
},
|
||||||
|
getNormalizedDate() {
|
||||||
|
return toUtcTimestamp(this.date);
|
||||||
|
},
|
||||||
|
equals(otherDate) {
|
||||||
|
const dateString = localeDateObjectToDateString(otherDate);
|
||||||
|
return this.dateString === dateString;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @returns {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function localeDateObjectToDateString(date) {
|
||||||
|
const normalizedDate = new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000);
|
||||||
|
normalizedDate.setUTCHours(0, 0, 0, 0);
|
||||||
|
return normalizedDate.toISOString().slice(0, 10);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the UTC timestamp of the given date with hours, minutes, seconds, and milliseconds set to zero.
|
||||||
|
* @param date
|
||||||
|
* @returns {number} UTC timestamp
|
||||||
|
*/
|
||||||
|
function toUtcTimestamp(date) {
|
||||||
|
const internalDate = new Date(date);
|
||||||
|
internalDate.setHours(0, 0, 0, 0);
|
||||||
|
return internalDate.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.addTranslation = addTranslation;
|
||||||
|
exports.getHolidayByDate = getHolidayByDate;
|
||||||
|
exports.getHolidays = getHolidays;
|
||||||
|
exports.getLanguage = getLanguage;
|
||||||
|
exports.isHoliday = isHoliday;
|
||||||
|
exports.isSpecificHoliday = isSpecificHoliday;
|
||||||
|
exports.isSunOrHoliday = isSunOrHoliday;
|
||||||
|
exports.setLanguage = setLanguage;
|
||||||
|
|
||||||
|
}));
|
||||||
|
//# sourceMappingURL=feiertage.umd.js.map
|
||||||
+1
File diff suppressed because one or more lines are too long
+144
@@ -0,0 +1,144 @@
|
|||||||
|
<!-- Generated by documentation.js. Update this documentation by updating the source code. -->
|
||||||
|
|
||||||
|
### Table of Contents
|
||||||
|
|
||||||
|
*Types*
|
||||||
|
- [HolidayType](#holidaytype)
|
||||||
|
- [Region](#region)
|
||||||
|
- [Holiday](#holiday)
|
||||||
|
- [allHolidays](#allholidays)
|
||||||
|
- [allRegions](#allregions)
|
||||||
|
- [TranslationTable](#translationtable)
|
||||||
|
|
||||||
|
*API*
|
||||||
|
- [isHoliday(date, region)](#isholiday)
|
||||||
|
- [getHolidayByDate(date, region)](#getholidaybydate)
|
||||||
|
- [getHolidays(year, region)](#getholidays)
|
||||||
|
- [isSunOrHoliday(date, region)](#issunorholiday)
|
||||||
|
- [isSpecificHoliday(date, name, region)](#isspecificholiday)
|
||||||
|
- [addTranslation(isoCode, translation)](#addtranslation)
|
||||||
|
- [setLanguage(lng)](#setlanguage)
|
||||||
|
- [getLanguage()](#getlanguage)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Types
|
||||||
|
|
||||||
|
### HolidayType
|
||||||
|
|
||||||
|
Type: (`"NEUJAHRSTAG"` \| `"HEILIGEDREIKOENIGE"` \| `"KARFREITAG"` \| `"OSTERSONNTAG"` \| `"OSTERMONTAG"` \| `"TAG_DER_ARBEIT"` \| `"CHRISTIHIMMELFAHRT"` \| `"MARIAHIMMELFAHRT"` \| `"PFINGSTSONNTAG"` \| `"PFINGSTMONTAG"` \| `"FRONLEICHNAM"` \| `"DEUTSCHEEINHEIT"` \| `"REFORMATIONSTAG"` \| `"ALLERHEILIGEN"` \| `"BUBETAG"` \| `"ERSTERWEIHNACHTSFEIERTAG"` \| `"ZWEITERWEIHNACHTSFEIERTAG"` \| `"WELTKINDERTAG"` \| `"WELTFRAUENTAG"` \| `"AUGSBURGER_FRIEDENSFEST"`)
|
||||||
|
|
||||||
|
### Region
|
||||||
|
|
||||||
|
Type: (`"BW"` \| `"BY"` \| `"BE"` \| `"BB"` \| `"HB"` \| `"HE"` \| `"HH"` \| `"MV"` \| `"NI"` \| `"NW"` \| `"RP"` \| `"SL"` \| `"SN"` \| `"ST"` \| `"SH"` \| `"TH"` \| `"BUND"` \| `"ALL"`)
|
||||||
|
|
||||||
|
As defined here: https://de.wikipedia.org/wiki/Land_(Deutschland)#Amtliche_bzw._Eigenbezeichnungen
|
||||||
|
|
||||||
|
The difference between BUND and ALL is defined as follows:
|
||||||
|
* "ALL" refers to every holiday which is valid in **at least** one region. So a holiday that only applies to one state will be included.
|
||||||
|
* "BUND" refers to holidays that are valid in every region ("bundesweit"). So a holiday that only applies to one state will not be included.
|
||||||
|
|
||||||
|
### Holiday
|
||||||
|
|
||||||
|
Type: {name: [HolidayType](#holidaytype), date: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), trans: function (lang: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?): [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), dateString: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), equals: function (date: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)): [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)}
|
||||||
|
|
||||||
|
**Properties**
|
||||||
|
|
||||||
|
- `name` **[HolidayType](#holidaytype)**
|
||||||
|
- `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)**
|
||||||
|
- `trans` **function (lang: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?): [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**
|
||||||
|
- `dateString` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**
|
||||||
|
- `equals` **function (date: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)): [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**
|
||||||
|
|
||||||
|
### allHolidays
|
||||||
|
|
||||||
|
Type: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[HolidayType](#holidaytype)>
|
||||||
|
|
||||||
|
### allRegions
|
||||||
|
|
||||||
|
Type: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Region](#region)>
|
||||||
|
|
||||||
|
### TranslationTable
|
||||||
|
|
||||||
|
Map of [HolidayType](#holidaytype) to translation string.
|
||||||
|
|
||||||
|
Type: {}
|
||||||
|
|
||||||
|
|
||||||
|
## API
|
||||||
|
### addTranslation()
|
||||||
|
|
||||||
|
Adds a translation for the holidays (e.g. English).
|
||||||
|
This also allows overriding the German names.
|
||||||
|
Hint: Interpolates German for missing translations
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `isoCode` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** of the new language
|
||||||
|
- `newTranslation` **[TranslationTable](#translationtable)** map of {HolidayType} to translation stringg
|
||||||
|
|
||||||
|
### setLanguage()
|
||||||
|
|
||||||
|
Set a language to default language
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `isoCode` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**
|
||||||
|
|
||||||
|
### getLanguage()
|
||||||
|
|
||||||
|
Get currently set language
|
||||||
|
|
||||||
|
Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**
|
||||||
|
|
||||||
|
### isSunOrHoliday()
|
||||||
|
|
||||||
|
Checks if a specific date is sunday or holiday.
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)**
|
||||||
|
- `region` **[Region](#region)**
|
||||||
|
|
||||||
|
Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**
|
||||||
|
|
||||||
|
### isHoliday()
|
||||||
|
|
||||||
|
Check is specific date is holiday.
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)**
|
||||||
|
- `region` **[Region](#region)** two character [Region](#region) code
|
||||||
|
|
||||||
|
Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**
|
||||||
|
|
||||||
|
### getHolidayByDate()
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)**
|
||||||
|
- `region` **[Region](#region)** (optional, default `'ALL'`)
|
||||||
|
|
||||||
|
Returns **([Holiday](#holiday) | void)**
|
||||||
|
|
||||||
|
### isSpecificHoliday()
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)**
|
||||||
|
- `holidayName` **[HolidayType](#holidaytype)**
|
||||||
|
- `region` **[Region](#region)** (optional, default `'ALL'`)
|
||||||
|
|
||||||
|
Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**
|
||||||
|
|
||||||
|
### getHolidays()
|
||||||
|
|
||||||
|
Returns all holidays of a year in a [Region](#region).
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `year` **([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number) \| [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String))**
|
||||||
|
- `region` **[Region](#region)**
|
||||||
|
|
||||||
|
Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Holiday](#holiday)>**
|
||||||
+113
@@ -0,0 +1,113 @@
|
|||||||
|
declare type Region =
|
||||||
|
| 'BW' // Baden-Württemberg
|
||||||
|
| 'BY' // Bayern
|
||||||
|
| 'BE' // Berlin
|
||||||
|
| 'BB' // Brandenburg
|
||||||
|
| 'HB' // Bremen
|
||||||
|
| 'HE' // Hessen
|
||||||
|
| 'HH' // Hamburg
|
||||||
|
| 'MV' // Mecklenburg-Vorpommern
|
||||||
|
| 'NI' // Niedersachsen
|
||||||
|
| 'NW' // Nordrhein-Westfalen
|
||||||
|
| 'RP' // Rheinland-Pfalz
|
||||||
|
| 'SL' // Saarland
|
||||||
|
| 'SN' // Sachsen
|
||||||
|
| 'ST' // Sachsen-Anhalt
|
||||||
|
| 'SH' // Schleswig-Holstein
|
||||||
|
| 'TH' // Thüringen
|
||||||
|
| 'BUND' // Gesamt-Deutschland
|
||||||
|
| 'AUGSBURG'
|
||||||
|
| 'ALL';
|
||||||
|
|
||||||
|
declare type Holiday = {
|
||||||
|
name: HolidayType;
|
||||||
|
date: Date;
|
||||||
|
trans?: (lang: string | undefined) => string; // deprecated;
|
||||||
|
translate: (lang?: string | undefined) => string;
|
||||||
|
dateString: string;
|
||||||
|
equals: (date: Date) => boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
declare type HolidayType =
|
||||||
|
| 'NEUJAHRSTAG'
|
||||||
|
| 'HEILIGEDREIKOENIGE'
|
||||||
|
| 'KARFREITAG'
|
||||||
|
| 'OSTERSONNTAG'
|
||||||
|
| 'OSTERMONTAG'
|
||||||
|
| 'TAG_DER_ARBEIT'
|
||||||
|
| 'CHRISTIHIMMELFAHRT'
|
||||||
|
| 'MARIAHIMMELFAHRT'
|
||||||
|
| 'PFINGSTSONNTAG'
|
||||||
|
| 'PFINGSTMONTAG'
|
||||||
|
| 'FRONLEICHNAM'
|
||||||
|
| 'DEUTSCHEEINHEIT'
|
||||||
|
| 'REFORMATIONSTAG'
|
||||||
|
| 'ALLERHEILIGEN'
|
||||||
|
| 'BUBETAG'
|
||||||
|
| 'ERSTERWEIHNACHTSFEIERTAG'
|
||||||
|
| 'ZWEITERWEIHNACHTSFEIERTAG';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of {@link HolidayType} to translation string.
|
||||||
|
*/
|
||||||
|
export type TranslationTable = {
|
||||||
|
[key: string]: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adds a translation for the holidays (e.g. english).
|
||||||
|
* This also allows to override the German names.
|
||||||
|
* Hint: Interpolates German for missing translations
|
||||||
|
* @param {string} isoCode of the new language
|
||||||
|
* @param {TranslationTable} newTranslation map of {HolidayType} to translation stringg
|
||||||
|
*/
|
||||||
|
declare function addTranslation(
|
||||||
|
isoCode: string,
|
||||||
|
newTranslation: TranslationTable,
|
||||||
|
): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a language to default language
|
||||||
|
* @param {string} isoCode
|
||||||
|
*/
|
||||||
|
declare function setLanguage(isoCode: string): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get currently set language
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
declare function getLanguage(): string;
|
||||||
|
|
||||||
|
// holidays api
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a specific date is sunday or holiday.
|
||||||
|
* @param date
|
||||||
|
* @param region
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
declare function isSunOrHoliday(date: Date, region: Region): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check is specific date is holiday.
|
||||||
|
* @param date
|
||||||
|
* @param {Region} region two character {@link Region} code
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
declare function isHoliday(date: Date, region: Region): boolean;
|
||||||
|
|
||||||
|
declare function getHolidayByDate(date: Date, region: Region): Holiday | void;
|
||||||
|
|
||||||
|
declare function isSpecificHoliday(
|
||||||
|
date: Date,
|
||||||
|
holidayName: HolidayType,
|
||||||
|
region: Region,
|
||||||
|
): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all holidays of a year in a {@link Region}.
|
||||||
|
* @param year
|
||||||
|
* @param region
|
||||||
|
* @returns {Array.<Holiday>}
|
||||||
|
*/
|
||||||
|
declare function getHolidays(year: number | string, region: Region): Holiday[];
|
||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
{
|
||||||
|
"name": "feiertagejs",
|
||||||
|
"version": "1.3.9",
|
||||||
|
"description": "A module to calculate German holidays made for node.js",
|
||||||
|
"type": "module",
|
||||||
|
"main": "build/feiertage.umd.cjs",
|
||||||
|
"module": "build/feiertage.js",
|
||||||
|
"types": "index.d.ts",
|
||||||
|
"scripts": {
|
||||||
|
"test": "vitest run --coverage",
|
||||||
|
"test:w": "vitest watch",
|
||||||
|
"format": "prettier --write \"{**/*,*}.{ts,json}\" \"!coverage/**\" \"!build/**\" \"!package.json\" \"!package-lock.json\" --cache",
|
||||||
|
"lint": "eslint \"src\" \"spec\"",
|
||||||
|
"build": "rollup -c"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sfakir/feiertagejs"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"node",
|
||||||
|
"holidays",
|
||||||
|
"feiertage",
|
||||||
|
"javascript"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0"
|
||||||
|
},
|
||||||
|
"author": "Simon Fakir",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/sfakir/feiertagejs/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/sfakir/feiertagejs",
|
||||||
|
"devDependencies": {
|
||||||
|
"@vitest/coverage-c8": "^0.26.2",
|
||||||
|
"prettier": "^2.8.1",
|
||||||
|
"rollup": "^3.9.0",
|
||||||
|
"@rollup/plugin-typescript": "^10.0.1",
|
||||||
|
"typescript": "^4.9.4",
|
||||||
|
"vitest": "^0.26.2",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.47.1",
|
||||||
|
"@typescript-eslint/parser": "^5.47.1",
|
||||||
|
"eslint": "^8.30.0",
|
||||||
|
"eslint-config-prettier": "^8.5.0"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"build",
|
||||||
|
"docs.md",
|
||||||
|
"Readme.md",
|
||||||
|
"index.d.ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
Generated
+20
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "TIF22A_AnwProjekt_B",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"dependencies": {
|
||||||
|
"feiertagejs": "^1.3.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/feiertagejs": {
|
||||||
|
"version": "1.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/feiertagejs/-/feiertagejs-1.3.9.tgz",
|
||||||
|
"integrity": "sha512-tUP+WBv2OWBhPwe3NfqwCtjMq+ym598a42tfqmL0FySswEb9xs96p2iKwqqx+lxKieu1njJBRZKsFm92bJhxZw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"feiertagejs": "^1.3.9"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user