UNPKG

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
"use strict"; 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;