Hola a todos!.
El post de hoy va de fechas 🙂
Hace ya algunos años (2015) hice una publicación en VBA trabajando con trabajaba con algunas funciones para crear y mostrar datos basados en fechas: FUNCIÓN DIASEM, FORMAT, TEXT, DATEDIFF Y DATEDIF PARA CALCULO DE FECHAS EN VBA
Hoy he querido replicar el cálculo de esas fechas (excepto la función SiFecha en su cálculo de Edad que ya tenía desarrollada en otros post y no quería ser redundante: PROGRAMAR LA FUNCION SIFECHA EN EXCEL ONLINE CON TYPESCRIPT).
Para ello voy a seleccionar algunas de las fechas de ese post inicial y comenzar a calcular:

Como podéis observar tenemos una serie de datos sobre la fecha inicial que vamos calculando en cada columna. El valor de la primera columna es nIni (el código final veréis cómo lo calculo).
En la columna B vamos a calcular el día de la semana, que en este caso fue un viernes y por lo tanto es el 5º día:
var diaSem = nIni.getUTCDay() + 1
En la columna C el nombre del día de la semana:
var nombreDiaSem = nIni.toLocaleDateString("es-ES", { weekday: "long" })
En la columna D el número del mes:
var mes = (nIni.getUTCMonth() + 1)
En la columna E el nombre del mes:
var nombreMes = nIni.toLocaleDateString("es-ES", { month: "long" })
En la columna F la fecha completa, que vamos a crear con el segundo parámetro de la función toLocaleDateString():
const options = {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
};
var fechaCompleta = nIni.toLocaleDateString("es-ES", options)
En la columna G el nombre de día en inglés:
var nombrediaEng = nIni.toLocaleDateString("en-US", { weekday: "long" })
En la columna H el nombre del mes en inglés:
var nombreMesEng = nIni.toLocaleDateString("en-US", { month: "long" })
En la columna I la fecha completa en Inglés:
var fechaCompletaEng = nIni.toLocaleDateString("en-US", options)
En la columna J los años totales entre la fecha inicial y la fecha actual:
var aniosTot = Math.abs(nIni.getUTCFullYear() - (new Date()).getFullYear());
En la columna K los meses totales entre dos fechas:
var mesesTot = (new Date().getFullYear() - nIni.getFullYear()) * 12 + (new Date().getMonth() - nIni.getMonth());
En la columna L los días totales entre dos fechas:
var diasTot = Math.floor((new Date().getTime() - nIni.getTime()) / (1000 * 60 * 60 * 24));
Ahora os dejo el código completo donde podéis ver cómo obtengo la fecha del rango inicial de la columna A y como después de calcular los datos los paso a la hoja:
function main(workbook: ExcelScript.Workbook) {
const miHoja = workbook.getWorksheet("Hoja1");
const valores = miHoja.getUsedRange().getValues();
const scadena: (string | number)[][] = [["DÍA SEMANA", "NOMBRE DÍA", "MES", "NOMBRE MES", "FECHA COMPLETA,", "NOMBRE DÍA INGLÉS", "NOMBRE MES INGLÉS", "FECHA COMPLETA INGLÉS", "AÑOS TOTALES", "MESES TOTALES", "DIAS TOTALES"]];
var nItem = 1;
valores.splice(1).forEach((row) => {
nItem = nItem + 1
//Obtenemos fecha, mes y dia de la columna A
var ini = new Date(Math.round((+row[0] - 25569) * 86400 * 1000)).toLocaleDateString("en-US");
var nIni = new Date(Date.parse(ini) + 0 * 24 * 60 * 60 * 1000);
//comenzamos a crear variables
var diaSem = nIni.getUTCDay() + 1
var nombreDiaSem = nIni.toLocaleDateString("es-ES", { weekday: "long" })
var mes = (nIni.getUTCMonth() + 1)
var nombreMes = nIni.toLocaleDateString("es-ES", { month: "long" })
const options = {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
};
var fechaCompleta = nIni.toLocaleDateString("es-ES", options)
var nombrediaEng = nIni.toLocaleDateString("en-US", { weekday: "long" })
var nombreMesEng = nIni.toLocaleDateString("en-US", { month: "long" })
var fechaCompletaEng = nIni.toLocaleDateString("en-US", options)
var aniosTot = Math.abs(nIni.getUTCFullYear() - (new Date()).getFullYear());
var mesesTot = (new Date().getFullYear() - nIni.getFullYear()) * 12 + (new Date().getMonth() - nIni.getMonth());
var diasTot = Math.floor((new Date().getTime() - nIni.getTime()) / (1000 * 60 * 60 * 24));
//pasamos los datos a una matriz
scadena.push([diaSem, nombreDiaSem, mes, nombreMes, fechaCompleta, nombrediaEng, nombreMesEng, fechaCompletaEng, aniosTot, mesesTot, diasTot,]
)
});
//pasamos los datos a la hoja
const hojaDest = workbook.getWorksheet("Hoja1");
const resultado = hojaDest.getRangeByIndexes(0, 1, scadena.length, scadena[0].length);
resultado.setValues(scadena);
}
Este es un post que me ha llevado algo de tiempo (he querido que los datos sean los mismos que los que obtendríamos con la función sifecha de Excel (excepto los de Edad).
Y esto es todo, espero que sea de utilidad
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies