├── package.json ├── LICENSE.md ├── .gitignore ├── holidays.js ├── app.js └── README.md /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "festivos-colombia", 3 | "version": "1.0.1", 4 | "description": "Módulo de JavaScript para obtener los días festivos de Colombia.", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/JuanB3r/festivos-colombia.git" 12 | }, 13 | "keywords": [ 14 | "colombia", 15 | "festivos" 16 | ], 17 | "author": "Juan Bermudez", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/JuanB3r/festivos-colombia/issues" 21 | }, 22 | "homepage": "https://github.com/JuanB3r/festivos-colombia#readme" 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [fullname] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (http://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | .eslintrc.json 52 | 53 | # Optional REPL history 54 | .node_repl_history 55 | 56 | # Output of 'npm pack' 57 | *.tgz 58 | 59 | # Yarn Integrity file 60 | .yarn-integrity 61 | 62 | # dotenv environment variables file 63 | .env 64 | 65 | 66 | 67 | # End of https://www.gitignore.io/api/node 68 | -------------------------------------------------------------------------------- /holidays.js: -------------------------------------------------------------------------------- 1 | const HOLIDAYS = [ 2 | { date: "01/01", nextMonday: false, name: "Año Nuevo" }, 3 | { date: "01/06", nextMonday: true, name: "Día de los Reyes Magos" }, 4 | { date: "03/19", nextMonday: true, name: "Día de San José" }, 5 | { daysToSum: -3, nextMonday: false, name: "Jueves Santo" }, 6 | { daysToSum: -2, nextMonday: false, name: "Viernes Santo" }, 7 | { date: "05/01", nextMonday: false, name: "Día del Trabajo" }, 8 | { daysToSum: 40, nextMonday: true, name: "Ascensión del Señor" }, 9 | { daysToSum: 60, nextMonday: true, name: "Corphus Christi" }, 10 | { daysToSum: 71, nextMonday: true, name: "Sagrado Corazón de Jesús" }, 11 | { date: "06/29", nextMonday: true, name: "San Pedro y San Pablo" }, 12 | { date: "07/20", nextMonday: false, name: "Día de la Independencia" }, 13 | { date: "08/07", nextMonday: false, name: "Batalla de Boyacá" }, 14 | { date: "08/15", nextMonday: true, name: "La Asunción de la Virgen" }, 15 | { date: "10/12", nextMonday: true, name: "Día de la Raza" }, 16 | { date: "11/01", nextMonday: true, name: "Todos los Santos" }, 17 | { date: "11/11", nextMonday: true, name: "Independencia de Cartagena" }, 18 | { date: "12/08", nextMonday: false, name: "Día de la Inmaculada Concepción" }, 19 | { date: "12/25", nextMonday: false, name: "Día de Navidad" } 20 | ]; 21 | 22 | /** 23 | * Modulo que contiene dos Objetos con las fechas de los días 24 | * festivos del año 25 | * @module holidays 26 | */ 27 | exports.holidays = HOLIDAYS; 28 | /* 29 | pascua entre marzo 22 y abril 25 30 | ascensión 40 días después de pascua 31 | corpus christi 60 días después de pascua 32 | sagrado corazon 71 días después de pascua 33 | */ -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Modulo que contiene la lógica para obtener los días festivos 3 | * @module calendar 4 | * @author Juan Bermudez 5 | * @since 1.0 6 | */ 7 | const HOLIDAYS = require("./holidays.js").holidays; 8 | 9 | /** 10 | * @function applyTwoDigits 11 | * Aplica el formato de dos dígitos a un número menor que diez 12 | * @author Juan Bermudez 13 | * @since 1.0 14 | * @param {number} number 15 | * @returns {string} texto formateado 16 | */ 17 | function applyTwoDigits(number) { 18 | return number < 10 ? "0" + number : number; 19 | } 20 | 21 | /** 22 | * @function formatDate 23 | * Aplica el formato DD/MM/YYYY a una fecha 24 | * @author Juan Bermudez 25 | * @since 1.0 26 | * @param {Date} date objeto con la fecha a formatear 27 | * @returns {string} texto de la fecha formateada 28 | */ 29 | function formatDate(date) { 30 | return applyTwoDigits(date.getDate()) + "/" + applyTwoDigits(date.getMonth() + 1) + "/" + date.getFullYear(); 31 | } 32 | 33 | /** 34 | * @function getEasterSunday 35 | * Algoritmo propuesto por Ian Stewart en 2001 para calcular la fecha 36 | * exacta del domingo de resurrección/pascua 37 | * @author Juan Bermudez 38 | * @since 1.0 39 | * @param {number} year número del año 40 | * @returns {Date} Retorna el domingo de resurrección/pascua 41 | */ 42 | function getEasterSunday(year) { 43 | let a, b, c, d, e, day; 44 | a = year % 19; 45 | b = year % 4; 46 | c = year % 7; 47 | d = (19 * a + 24) % 30; 48 | e = (2 * b + 4 * c + 6 * d + 5) % 7; 49 | day = 22 + d + e; 50 | 51 | if (day >= 1 && day <= 31) { 52 | return new Date(`03/${applyTwoDigits(day)}/${year}`); 53 | } else { 54 | return new Date(`04/${applyTwoDigits(day - 31)}/${year}`); 55 | } 56 | } 57 | 58 | /** 59 | * @function getNextMonday 60 | * Calcula el próximo lunes de una fecha dada 61 | * @author Juan Bermudez 62 | * @since 1.0 63 | * @param {Date} date fecha de partida 64 | * @returns {Date} retorna el próximo lunes a la fecha 65 | */ 66 | function getNextMonday(date) { 67 | //console.log("Fecha recibida: " + date.toDateString()); 68 | while (date.getDay() !== 1) { 69 | date.setDate(date.getDate() + 1); 70 | //console.log("New date: " + date); 71 | } 72 | return date; 73 | } 74 | 75 | /** 76 | * @function sumDay 77 | * Suma una cantidad de días a una fecha dada 78 | * @author Juan Bermudez 79 | * @since 1.0 80 | * @param {string} stringDate objeto de la fecha 81 | * @param {number} dayToSum cantidad de días a sumar 82 | * @returns {Date} retorna la nueva fecha con los días sumados 83 | */ 84 | function sumDay(stringDate, dayToSum) { 85 | let date = new Date(stringDate); 86 | date.setDate(date.getDate() + dayToSum); 87 | return date; 88 | } 89 | 90 | /** 91 | * @function getHolidaysByYear 92 | * Calcula y retorna el listado de festivos de un año dado 93 | * @author Juan Bermudez 94 | * @since 1.0 95 | * @param {number} year número del año 96 | * @returns {Array} Array con todos los festivos del año 97 | */ 98 | function getHolidaysByYear(year) { 99 | let holidaysArray = []; 100 | //Obtiene el domingo de pascua para calcular los días litúrgicos 101 | let easterSunday = getEasterSunday(year); 102 | 103 | HOLIDAYS.forEach(element => { 104 | let date; 105 | if (!element.daysToSum) { 106 | date = new Date(element.date + "/" + year); 107 | } else { 108 | date = sumDay(easterSunday.toDateString(), element.daysToSum); 109 | } 110 | 111 | if (element.nextMonday) { 112 | date = getNextMonday(date); 113 | } 114 | holidaysArray.push({ 115 | date: formatDate(date), 116 | name: element.name, 117 | static: element.nextMonday 118 | }); 119 | }); 120 | return holidaysArray; 121 | } 122 | 123 | /** 124 | * @function getHolidaysByYear 125 | * Calcula todos los días festivos de un rango de años 126 | * @author Juan Bermudez 127 | * @since 1.0 128 | * @param {*} initialYear año de inicio del rango 129 | * @param {*} finalYear año final del rango 130 | * @returns {Array} Array con todos los festivos del año 131 | */ 132 | function getHolidaysByYearInterval(initialYear, finalYear) { 133 | let holidaysArray = []; 134 | //Obtiene el domingo de pascua para calcular los días litúrgicos 135 | for (let i = initialYear; i <= finalYear; i++) { 136 | let year = { 137 | year : i, 138 | holidays: [] 139 | }; 140 | let easterSunday = getEasterSunday(i); 141 | 142 | HOLIDAYS.forEach(element => { 143 | let date; 144 | if (!element.daysToSum) { 145 | date = new Date(element.date + "/" + i); 146 | } else { 147 | date = sumDay(easterSunday.toDateString(), element.daysToSum); 148 | } 149 | 150 | if (element.nextMonday) { 151 | date = getNextMonday(date); 152 | } 153 | year.holidays.push({ 154 | date: formatDate(date), 155 | name: element.name, 156 | static: element.nextMonday 157 | }); 158 | }); 159 | holidaysArray.push(year); 160 | } 161 | return holidaysArray; 162 | } 163 | 164 | /** 165 | * @function isHoliday 166 | * Calcula si un dia en especifico es festivo 167 | * @author Santiago Alarcón 168 | * @since 1.0.1 169 | * @param {Date} date Fecha que se busca saber si es o no festivo. 170 | * @returns {Boolean} Booleano que indica si es o no es festivo. 171 | */ 172 | 173 | function isHoliday(date) { 174 | return !!getHolidaysByYear(date.getFullYear()).find((holiday) => { 175 | return holiday.date == formatDate(date); 176 | }) 177 | } 178 | 179 | module.exports.getHolidaysByYear = getHolidaysByYear; 180 | module.exports.getHolidaysByYearInterval = getHolidaysByYearInterval; 181 | module.exports.isHoliday = isHoliday; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FESTIVOS COLOMBIA 2 | 3 | Módulo de JavaScript para obtener los días festivos de Colombia. 4 | [Basado en la ley 51 de 1983](http://www.alcaldiabogota.gov.co/sisjur/normas/Norma1.jsp?i=4954). 5 | 6 | ## Example 7 | 8 | `npm install festivos-colombia` 9 | 10 | ```javascript 11 | const fc = require('festivos-colombia'); 12 | 13 | let year = 2018; 14 | 15 | let holidays = fc.getHolidaysByYear(year); 16 | holidays.forEach(element => { 17 | if (element.static) { 18 | console.log(element.date + " - " + element.name); 19 | } else { 20 | console.log(element.date + " - " + element.name); 21 | } 22 | }); 23 | 24 | // OUTPUT 25 | // 01/01/2018 - Año Nuevo 26 | // 08/01/2018 - Día de los Reyes Magos 27 | // 19/03/2018 - Día de San José 28 | // 29/03/2018 - Jueves Santo 29 | // 30/03/2018 - Viernes Santo 30 | // 01/05/2018 - Día del Trabajo 31 | // 14/05/2018 - Ascensión del Señor 32 | // 04/06/2018 - Corphus Christi 33 | // 11/06/2018 - Sagrado Corazón de Jesús 34 | // 02/07/2018 - San Pedro y San Pablo 35 | // 20/07/2018 - Día de la Independencia 36 | // 07/08/2018 - Batalla de Boyacá 37 | // 20/08/2018 - La Asunción de la Virgen 38 | // 15/10/2018 - Día de la Raza 39 | // 05/11/2018 - Todos los Santos 40 | // 12/11/2018 - Independencia de Cartagena 41 | // 08/12/2018 - Día de la Inmaculada Concepción 42 | // 25/12/2018 - Día de Navidad 43 | 44 | holidays = fc.getHolidaysByYearInterval(year, 2026); 45 | holidays.forEach(obj => { 46 | console.log("Año: " + obj.year); 47 | obj.holidays.forEach(element => { 48 | if (element.static) { 49 | console.log(element.date + " - " + element.name); 50 | } else { 51 | console.log(element.date + " - " + element.name); 52 | } 53 | }); 54 | }); 55 | 56 | // OUTPUT 57 | // Año: 2018 58 | // 01/01/2018 - Año Nuevo 59 | // 08/01/2018 - Día de los Reyes Magos 60 | // 19/03/2018 - Día de San José 61 | // 29/03/2018 - Jueves Santo 62 | // 30/03/2018 - Viernes Santo 63 | // 01/05/2018 - Día del Trabajo 64 | // 14/05/2018 - Ascensión del Señor 65 | // 04/06/2018 - Corphus Christi 66 | // 11/06/2018 - Sagrado Corazón de Jesús 67 | // 02/07/2018 - San Pedro y San Pablo 68 | // 20/07/2018 - Día de la Independencia 69 | // 07/08/2018 - Batalla de Boyacá 70 | // 20/08/2018 - La Asunción de la Virgen 71 | // 15/10/2018 - Día de la Raza 72 | // 05/11/2018 - Todos los Santos 73 | // 12/11/2018 - Independencia de Cartagena 74 | // 08/12/2018 - Día de la Inmaculada Concepción 75 | // 25/12/2018 - Día de Navidad 76 | // Año: 2019 77 | // 01/01/2019 - Año Nuevo 78 | // 07/01/2019 - Día de los Reyes Magos 79 | // 25/03/2019 - Día de San José 80 | // 18/04/2019 - Jueves Santo 81 | // 19/04/2019 - Viernes Santo 82 | // 01/05/2019 - Día del Trabajo 83 | // 03/06/2019 - Ascensión del Señor 84 | // 24/06/2019 - Corphus Christi 85 | // 01/07/2019 - Sagrado Corazón de Jesús 86 | // 01/07/2019 - San Pedro y San Pablo 87 | // 20/07/2019 - Día de la Independencia 88 | // 07/08/2019 - Batalla de Boyacá 89 | // 19/08/2019 - La Asunción de la Virgen 90 | // 14/10/2019 - Día de la Raza 91 | // 04/11/2019 - Todos los Santos 92 | // 11/11/2019 - Independencia de Cartagena 93 | // 08/12/2019 - Día de la Inmaculada Concepción 94 | // 25/12/2019 - Día de Navidad 95 | // Año: 2020 96 | // 01/01/2020 - Año Nuevo 97 | // 06/01/2020 - Día de los Reyes Magos 98 | // 23/03/2020 - Día de San José 99 | // 09/04/2020 - Jueves Santo 100 | // 10/04/2020 - Viernes Santo 101 | // 01/05/2020 - Día del Trabajo 102 | // 25/05/2020 - Ascensión del Señor 103 | // 15/06/2020 - Corphus Christi 104 | // 22/06/2020 - Sagrado Corazón de Jesús 105 | // 29/06/2020 - San Pedro y San Pablo 106 | // 20/07/2020 - Día de la Independencia 107 | // 07/08/2020 - Batalla de Boyacá 108 | // 17/08/2020 - La Asunción de la Virgen 109 | // 12/10/2020 - Día de la Raza 110 | // 02/11/2020 - Todos los Santos 111 | // 16/11/2020 - Independencia de Cartagena 112 | // 08/12/2020 - Día de la Inmaculada Concepción 113 | // 25/12/2020 - Día de Navidad 114 | // Año: 2021 115 | // 01/01/2021 - Año Nuevo 116 | // 11/01/2021 - Día de los Reyes Magos 117 | // 22/03/2021 - Día de San José 118 | // 01/04/2021 - Jueves Santo 119 | // 02/04/2021 - Viernes Santo 120 | // 01/05/2021 - Día del Trabajo 121 | // 17/05/2021 - Ascensión del Señor 122 | // 07/06/2021 - Corphus Christi 123 | // 14/06/2021 - Sagrado Corazón de Jesús 124 | // 05/07/2021 - San Pedro y San Pablo 125 | // 20/07/2021 - Día de la Independencia 126 | // 07/08/2021 - Batalla de Boyacá 127 | // 16/08/2021 - La Asunción de la Virgen 128 | // 18/10/2021 - Día de la Raza 129 | // 01/11/2021 - Todos los Santos 130 | // 15/11/2021 - Independencia de Cartagena 131 | // 08/12/2021 - Día de la Inmaculada Concepción 132 | // 25/12/2021 - Día de Navidad 133 | // Año: 2022 134 | // 01/01/2022 - Año Nuevo 135 | // 10/01/2022 - Día de los Reyes Magos 136 | // 21/03/2022 - Día de San José 137 | // 14/04/2022 - Jueves Santo 138 | // 15/04/2022 - Viernes Santo 139 | // 01/05/2022 - Día del Trabajo 140 | // 30/05/2022 - Ascensión del Señor 141 | // 20/06/2022 - Corphus Christi 142 | // 27/06/2022 - Sagrado Corazón de Jesús 143 | // 04/07/2022 - San Pedro y San Pablo 144 | // 20/07/2022 - Día de la Independencia 145 | // 07/08/2022 - Batalla de Boyacá 146 | // 15/08/2022 - La Asunción de la Virgen 147 | // 17/10/2022 - Día de la Raza 148 | // 07/11/2022 - Todos los Santos 149 | // 14/11/2022 - Independencia de Cartagena 150 | // 08/12/2022 - Día de la Inmaculada Concepción 151 | // 25/12/2022 - Día de Navidad 152 | // Año: 2023 153 | // 01/01/2023 - Año Nuevo 154 | // 09/01/2023 - Día de los Reyes Magos 155 | // 20/03/2023 - Día de San José 156 | // 06/04/2023 - Jueves Santo 157 | // 07/04/2023 - Viernes Santo 158 | // 01/05/2023 - Día del Trabajo 159 | // 22/05/2023 - Ascensión del Señor 160 | // 12/06/2023 - Corphus Christi 161 | // 19/06/2023 - Sagrado Corazón de Jesús 162 | // 03/07/2023 - San Pedro y San Pablo 163 | // 20/07/2023 - Día de la Independencia 164 | // 07/08/2023 - Batalla de Boyacá 165 | // 21/08/2023 - La Asunción de la Virgen 166 | // 16/10/2023 - Día de la Raza 167 | // 06/11/2023 - Todos los Santos 168 | // 13/11/2023 - Independencia de Cartagena 169 | // 08/12/2023 - Día de la Inmaculada Concepción 170 | // 25/12/2023 - Día de Navidad 171 | // Año: 2024 172 | // 01/01/2024 - Año Nuevo 173 | // 08/01/2024 - Día de los Reyes Magos 174 | // 25/03/2024 - Día de San José 175 | // 28/03/2024 - Jueves Santo 176 | // 29/03/2024 - Viernes Santo 177 | // 01/05/2024 - Día del Trabajo 178 | // 13/05/2024 - Ascensión del Señor 179 | // 03/06/2024 - Corphus Christi 180 | // 10/06/2024 - Sagrado Corazón de Jesús 181 | // 01/07/2024 - San Pedro y San Pablo 182 | // 20/07/2024 - Día de la Independencia 183 | // 07/08/2024 - Batalla de Boyacá 184 | // 19/08/2024 - La Asunción de la Virgen 185 | // 14/10/2024 - Día de la Raza 186 | // 04/11/2024 - Todos los Santos 187 | // 11/11/2024 - Independencia de Cartagena 188 | // 08/12/2024 - Día de la Inmaculada Concepción 189 | // 25/12/2024 - Día de Navidad 190 | // Año: 2025 191 | // 01/01/2025 - Año Nuevo 192 | // 06/01/2025 - Día de los Reyes Magos 193 | // 24/03/2025 - Día de San José 194 | // 17/04/2025 - Jueves Santo 195 | // 18/04/2025 - Viernes Santo 196 | // 01/05/2025 - Día del Trabajo 197 | // 02/06/2025 - Ascensión del Señor 198 | // 23/06/2025 - Corphus Christi 199 | // 30/06/2025 - Sagrado Corazón de Jesús 200 | // 30/06/2025 - San Pedro y San Pablo 201 | // 20/07/2025 - Día de la Independencia 202 | // 07/08/2025 - Batalla de Boyacá 203 | // 18/08/2025 - La Asunción de la Virgen 204 | // 13/10/2025 - Día de la Raza 205 | // 03/11/2025 - Todos los Santos 206 | // 17/11/2025 - Independencia de Cartagena 207 | // 08/12/2025 - Día de la Inmaculada Concepción 208 | // 25/12/2025 - Día de Navidad 209 | // Año: 2026 210 | // 01/01/2026 - Año Nuevo 211 | // 12/01/2026 - Día de los Reyes Magos 212 | // 23/03/2026 - Día de San José 213 | // 02/04/2026 - Jueves Santo 214 | // 03/04/2026 - Viernes Santo 215 | // 01/05/2026 - Día del Trabajo 216 | // 18/05/2026 - Ascensión del Señor 217 | // 08/06/2026 - Corphus Christi 218 | // 15/06/2026 - Sagrado Corazón de Jesús 219 | // 29/06/2026 - San Pedro y San Pablo 220 | // 20/07/2026 - Día de la Independencia 221 | // 07/08/2026 - Batalla de Boyacá 222 | // 17/08/2026 - La Asunción de la Virgen 223 | // 12/10/2026 - Día de la Raza 224 | // 02/11/2026 - Todos los Santos 225 | // 16/11/2026 - Independencia de Cartagena 226 | // 08/12/2026 - Día de la Inmaculada Concepción 227 | // 25/12/2026 - Día de Navidad 228 | ``` --------------------------------------------------------------------------------