moment-feiertage
Version:
Moment.js Plugin for german holidays; check if a given Date is a german holiday
245 lines (244 loc) • 7.36 kB
JavaScript
;
var moment = require("moment");
var allStates = [
'BW',
'BY',
'BE',
'BB',
'HB',
'HH',
'HE',
'MV',
'NI',
'NW',
'RP',
'SL',
'SN',
'ST',
'SH',
'TH',
];
var allHolidays = {};
var getAllStateCodes = function () {
return allStates;
};
var isHoliday = function (_states) {
var _moment = this;
if (!Object.prototype.hasOwnProperty.call(allHolidays, _moment.year().toString())) {
allHolidays[_moment.year().toString()] = calculateHolidays(_moment.year());
}
if (typeof _states === 'string' || !_states) {
return _isHoliday106(_moment, _states);
}
if (Array.isArray(_states)) {
return _isHoliday(_moment, _states);
}
return false;
};
var getHolidaysByYear = function (_year) {
if (!Object.prototype.hasOwnProperty.call(allHolidays, _year.toString())) {
return calculateHolidays(_year);
}
return allHolidays[_year.toString()];
};
moment.fn.isHoliday = isHoliday;
moment.getHolidaysByYear = getHolidaysByYear;
moment.getAllStateCodes = getAllStateCodes;
var _isHoliday106 = function (_moment, _state) {
if (Object.prototype.hasOwnProperty.call(allHolidays, _moment.year().toString()) &&
allHolidays[_moment.year().toString()]) {
var holidays = allHolidays[_moment.year().toString()];
for (var _i = 0, _a = Object.keys(holidays); _i < _a.length; _i++) {
var h = _a[_i];
if (_moment.isSame(holidays[h].date, 'day')) {
if (holidays[h].state.length === 0) {
return h;
}
else {
if (_state && holidays[h].state.indexOf(_state) > -1) {
return h;
}
else {
return false;
}
}
}
}
}
return false;
};
var _isHoliday = function (_moment, _states) {
var result = {
allStates: false,
holidayName: '',
holidayStates: [],
testedStates: [],
};
if (_states && _states.length < 1) {
result.testedStates = allStates;
}
else {
result.testedStates = validateStateCodes(_states);
}
for (var _i = 0, _a = result.testedStates; _i < _a.length; _i++) {
var s = _a[_i];
var holiday = _isHoliday106(_moment, s);
if (holiday && typeof holiday === 'string') {
result.holidayStates.push(s);
result.holidayName = holiday;
}
}
var nationHoliday = _isHoliday106(_moment);
if (nationHoliday && typeof nationHoliday === 'string') {
result.allStates = true;
result.holidayName = nationHoliday;
}
return result;
};
var validateStateCodes = function (_states) {
var validCodes = [];
for (var _i = 0, _states_1 = _states; _i < _states_1.length; _i++) {
var s = _states_1[_i];
if (s && allStates.indexOf(s) > -1) {
validCodes.push(s);
}
}
validCodes = validCodes.filter(function (item, i) { return validCodes.indexOf(item) === i; });
return validCodes;
};
var calculateHolidays = function (year) {
var easter = calculateEasterDate(year);
var holidays = {
Neujahrstag: {
date: moment("".concat(year, "-01-01")),
state: [],
},
'Heilige Drei Könige': {
date: moment("".concat(year, "-01-06")),
state: ['BW', 'BY', 'ST'],
},
Karfreitag: {
date: moment("".concat(easter)).subtract(2, 'days'),
state: [],
},
Ostersonntag: {
date: moment("".concat(easter)),
state: ['BB'],
},
Ostermontag: {
date: moment("".concat(easter)).add(1, 'days'),
state: [],
},
Maifeiertag: {
date: moment("".concat(year, "-05-01")),
state: [],
},
'Christi Himmelfahrt': {
date: moment("".concat(easter)).add(39, 'days'),
state: [],
},
Pfingstsonntag: {
date: moment("".concat(easter)).add(49, 'days'),
state: ['BB'],
},
Pfingstmontag: {
date: moment("".concat(easter)).add(50, 'days'),
state: [],
},
Fronleichnam: {
date: moment("".concat(easter)).add(60, 'days'),
state: ['BW', 'BY', 'HE', 'NW', 'RP', 'SL'],
},
'Mariä Himmelfahrt': {
date: moment("".concat(year, "-08-15")),
state: ['SL'],
},
'Tag der deutschen Einheit': {
date: moment("".concat(year, "-10-03")),
state: [],
},
Reformationstag: {
date: moment("".concat(year, "-10-31")),
state: ['BB', 'MV', 'SN', 'ST', 'TH'],
},
Allerheiligen: {
date: moment("".concat(year, "-11-01")),
state: ['BW', 'BY', 'NW', 'RP', 'SL'],
},
'Buß- und Bettag': {
date: calculateBandBDate(year),
state: ['SN'],
},
'1. Weihnachtsfeiertag': {
date: moment("".concat(year, "-12-25")),
state: [],
},
'2. Weihnachtsfeiertag': {
date: moment("".concat(year, "-12-26")),
state: [],
},
};
if (+year === 2017) {
holidays['Reformationstag'].state = [];
}
if (+year > 2017) {
holidays['Reformationstag'].state = [
'BB',
'HB',
'HH',
'MV',
'NI',
'SN',
'ST',
'SH',
'TH',
];
}
if (+year > 2018) {
holidays['Internationaler Frauentag'] = {
date: moment("".concat(year, "-03-08")),
state: ['BE'],
};
if (+year > 2022) {
holidays['Internationaler Frauentag'].state.push('MV');
}
holidays['Weltkindertag'] = {
date: moment("".concat(year, "-09-20")),
state: ['TH'],
};
}
if (year == 2020) {
holidays['Tag der Befreiung'] = {
date: moment("".concat(year, "-05-08")),
state: ['BE'],
};
}
return holidays;
};
var calculateEasterDate = function (Y) {
var C = Math.floor(Y / 100);
var N = Y - 19 * Math.floor(Y / 19);
var K = Math.floor((C - 17) / 25);
var I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;
I = I - 30 * Math.floor(I / 30);
I = I - Math.floor(I / 28) * (1 - Math.floor(I / 28) * Math.floor(29 / (I + 1)) * Math.floor((21 - N) / 11));
var J = Y + Math.floor(Y / 4) + I + 2 - C + Math.floor(C / 4);
J = J - 7 * Math.floor(J / 7);
var L = I - J;
var M = 3 + Math.floor((L + 40) / 44);
var D = L + 28 - 31 * Math.floor(M / 4);
return "".concat(Y, "-").concat(padout(M), "-").concat(padout(D));
};
var padout = function (num) {
return num < 10 ? "0".concat(num) : "".concat(num);
};
var calculateBandBDate = function (year) {
for (var i = 1; i < 8; i++) {
var day = moment("".concat(year, "-11-23")).subtract(i, 'days');
if (day.isoWeekday() === 3) {
return day;
}
}
return moment.invalid();
};
module.exports = moment;