Bienvenidos sean a este post, en el post anterior vimos como trabajar con el tiempo, es decir fecha y hora, vimos como podemos obtener la fecha y la hora actuales (y ambos tambien), hemos visto como podemos armar una nosotros con una funcion para calcular una futura o una pasada pero hoy nos centraremos mas en ver como obtener una parte de la estructura de una fecha como tambien podemos realizar otras operaciones en ella directamente, comencemos.
Estructura de la fecha
Cuando hablamos de la estructura nos referimos a obtener una parte de la misma, en el post anterior hicimos un ejemplo por medio de split creando un array donde sabiamos que teniamos el dia, el mes y el año pero VBScript nos ofrece cuatro funciones para obtener esto:
- Day(fecha), nos devuelve el numero del dia de la fecha informada
- Month(fecha), nos devuelve el mes de la fecha informada
- Year(fecha), nos devuelve el año de la fecha informada
- WeekDay(fecha, inicio), nos devuelve la posicion del dia de la fecha informada
- MonthName(mes, booleano), nos devuelve el nombre del mes de un valor obtenido por month
- WeekDayName(dia, booleano, inicio), nos devuelve el nombre del dia informado
En el caso de WeekDay no solo pasamos la fecha, sino que tambien podemos especificar cual es el primer dia de la semana, sino se especifica ninguna la opcion predeterminada es Domingo, por ejemplo si en nuestra region o nosotros tomamos como el primer dia el Lunes, se deberia usar de esta manera:
WeekDay("09/12/2019", 2) -> De esta forma devolvera 1
Si nosotros no especificaramos el 2 en lugar de devolver 1 nos devolvera 2, a partir de la version 3 existe una serie de constantes que podemos utilizar para estos casos, veamos la siguiente tabla:
Constante | Valor | Nombre del dia |
vbSunday | 1 | Domingo |
vbMonday | 2 | Lunes |
vbTuesday | 3 | Martes |
vbWednesday | 4 | Miercoles |
vbThursday | 5 | Jueves |
vbFriday | 6 | Viernes |
vbSaturday | 7 | Sabado |
vbUseSystem | 0 | Usa la configuracion del sistema |
Para evitar inconvenientes lo mas recomendables es usar la ultima opcion, en el caso de MonthName tenemos un valor booleano adicional que sera utilizado para indicar si debe abreviar o no el nombre, en el caso de WeekDayName, tenemos el mismo booleano y tambien desde que dia comienza la semana (inicio), para el caso de las horas pasa lo mismo, se usan las siguientes funciones:
- hour(hora), devuelve las horas de una hora informada
- minute(hora), devuelve los minutos de una hora informada
- second(hora), devuelve los segundos de una hora informada
Para entender mejor el concepto vamos a efectuar un ejemplo para ello vamos a usar el siguiente codigo:
timestruc.vbs
dim fecha
fecha = date
dia = day(fecha)
mes = month(fecha)
ano = year(fecha)
diaSem = weekday(fecha, vbUseSystem)
nombreMes = monthname(mes)
diaNom = weekdayname(diaSem)
texto = "Day: " & dia & vbCrLf
texto = texto & "Month: " & mes & vbCrLf
texto = texto & "Year: " & ano & vbCrLf
texto = texto & "WeekDay: " & diaSem & vbCrLf
texto = texto & "MonthName: " & nombreMes & vbCrLf
texto = texto & "WeekDayName: " & diaNom & vbCrLf
msgbox texto,,"Todos los tipos de estructuras"
Este es un codigo sencillo donde descomponemos la estructura de la fecha que guardamos en la variable fecha, vean como a cada funcion la asignamos a una variable distinta, donde tendremos una para el dia, otra para el mes, otra para el año, otro para indicar la posicion del dia en la semana, otra para que nos devuelva el nombre del mes, y uno para para devolvernos el nombre del dia, en el siguiente bloque veremos como ingresaremos todos los resultados en una variable llamada texto, en este caso ingresaremos uno por uno con una etiqueta para identificarlo, si lo ejecutamos veremos esto

Vamos a hacer la siguiente modificacion en nuestro codigo agregando la siguiente linea antes del msgbox:
texto = texto & diaNom & ", " & dia & " de " & nombreMes & " del " & ano
Esta nos agregara una nueva linea en texto pero con una estructura de fecha como se ve a continuacion

Con esto hemos visto como obtener las distintas partes de una fecha y como podemos aprovecharlas para otros formatos mas adecuados para nuestros codigos, veamos la siguiente funcion.
DatePart
Todas las funciones anteriores pueden ser reemplazadas por esta ya que nos permite extraer una parte de la fecha informada, para ello usamos la siguiente sintaxis:
DatePart(extraccion, fecha/hora[, primer_dia_semana][, primer_semana_año])
Extraccion es la cadena que le enviaremos que debe extraer, para ello tenemos la siguiente tabla:
Cadena | Significado |
yyyy | Año |
q | Trimestre |
m | Mes |
y | Dia del año |
d | Dia |
w | Dia de la semana |
ww | Semana del año |
h | Hora |
n | Minutos |
s | Segundos |
Despues ingresaremos la fecha/hora a analizar, los siguientes dos parametros son opcionales, con el primero le diremos cual es el primer dia de la semana igual al post anterior y en el ultimo parametro tendremos los siguientes valores disponibles:
Constante | Valor | Descripcion |
vbUseSystem | 0 | Utiliza el valor de la API de NLS |
vbFirstJan1 | 1 | Empieza con la semana que contiene el 1 de enero (predeterminado) |
vBFirstFourdays | 2 | Empieza con la semana que contenga 4 dias del año nuevo |
vbFirstFullWeek | 3 | Idem al anterior pero con la semana completa en el año nuevo |
Tomemos el ejemplo anterior y modifiquemoslo de la siguiente manera:
dim fecha
fecha = date
dia = datepart("d",fecha)
mes = datepart("m",fecha)
ano = datepart("yyyy",fecha)
diaSem = datepart("w",fecha)
nombreMes = monthname(mes)
diaNom = weekdayname(diaSem)
texto = "Day: " & dia & vbCrLf
texto = texto & "Month: " & mes & vbCrLf
texto = texto & "Year: " & ano & vbCrLf
texto = texto & "WeekDay: " & diaSem & vbCrLf
texto = texto & "MonthName: " & nombreMes & vbCrLf
texto = texto & "WeekDayName: " & diaNom & vbCrLf
texto = texto & diaNom & ", " & dia & " de " & nombreMes & " del " & ano
msgbox texto,,"Todos los tipos de estructuras"
La diferencia esta que ahora con una sola funcion podemos obtener todos los datos necesarios sin necesidad de recordar cada uno de ellos, si lo prueban deberan obtener el mismo resultado que antes, veamos una ultima modificacion para ver las nuevas caracteristicas, para ello agreguemos las siguientes lineas antes del msgbox:
texto = texto & vbCrLf & "Dia del año: " & datepart("y", fecha) & vbCrLf
texto = texto & "Semana del año: " & datepart("ww", fecha) & vbCrLf
texto = texto & "Trimestre: " & datepart("q", fecha)
Con esto obtendremos cual es el dia del año, en que semana del año esta ubicada y en cual trimestre, probemos par ver su resultado

En este caso podemos ver como funciono correctamente, pasemos a la siguiente funcion.
DateAdd
En el post anterior vimos como trabajar con una funcion, DateSerial, que nos permitia generar una fecha pero a su vez aplicar una operacion arimetica para incrementarla o disminuirla, en ese caso usamos uno para incrementar el año, disminuir el mes e incrementar el dia pero hoy veremos una funcion que trabaja de la misma forma pero mas simple ya que es una funcion entre dicha funcion y DatePart, para ello veamos su sintaxis:
DateAdd(intervalo, valor, fecha_original)
En este caso para intervalo usaremos las mismas cadenas que usamos para DatePart, con el mismo significado, valor sera la cantidad que incrementaremos y fecha_original sera la fecha que incrementaremos, vamos a tomar tiempo.vbs del post anterior y vamos a modificarlo de la siguiente manera:
dim dia
dia = dateadd("d",1779,now)
msgbox formatdatetime(dia, vbLongDate)
Sin necesidad de hacer un split y tener que incrementar parte por parte obtendremos el mismo resultado que se vio en el post anterior, si lo probamos porque en este caso toma la fecha y hora actual y la incrementa en 1779 dias, esto es debido a que usamos el intervalo de dias, una particularidad de esta funcion es que nos permite anidar varias funciones y tambien restar dias si en lugar de usar numeros positivos usamos negativos, tomemos el codigo anterior y modifiquemoslo de la siguiente manera:
dim dia
fecha = now
dia = dateadd("h", -5, dateadd("d", -30, dateadd("yyyy", -4, now)))
msgbox "Fecha original: " & fecha & vbCrLf & "Fecha modificada: " & dia
En este caso vamos a guardar en fecha la fecha y hora actual, luego en dia usaremos a varios dateadd anidados, el primero restara 5 horas pero lo restara de la devolucion del segundo dateadd que le restara 30 dias al resultado del tercer dateadd que le restara 4 años al now que informamos, por ultimo mostraremos el valor original y el modificado

Con esto hemos logrado hacer una modificacion muy facil de fechas ya que nos permite incrementar o disminuir una fecha la cantidad que sea necesaria, ya sea horas, minutos, segundos, dias, meses o incluso años, pero en algunas ocasiones necesitaremos calcular la diferencia entre dos fechas y para ello tenemos la siguiente funcion.
DateDiff
Trabaja de forma similar a la anterior pero con algunas sutiles diferencias, veamos primero su sintaxis:
DateDiff(intervalo, fecha1, fecha2[, primer_dia_semana][,primer_semana_año])
En este caso tendremos campos obligatorios, uno es intervalo que al igual que en el caso anterior lo usaremos para definir que campo hara la diferencia, fecha1 y fecha2 que seran las fechas a calcular la diferencia, fecha1 siempre debe ser la mas vieja y fecha2 la mas nueva, primer_dia_semana y primer_semana_año son opcionales y tienen las mismas propiedades que vimos anteriormente, si no se informa ninguna toma las predeterminadas, para este caso vamos a utilizar el siguiente codigo:
edad.vbs
dim nacim
dim texto
nacim = inputbox("ingresa tu cumpleaños:")
texto = "Lleva: " & vbCrLf
texto = texto & datediff("yyyy", nacim, now) & " años" & vbCrLf
texto = texto & datediff("q", nacim, now) & " trimestres" & vbCrLf
texto = texto & datediff("d", nacim, now) & " dias" & vbCrLf
texto = texto & datediff("h", nacim, now) & " horas" & vbCrLf
texto = texto & datediff("n", nacim, now) & " minutos" & vbCrLf
texto = texto & datediff("s", nacim, now) & " segundos" & vbCrLf
msgbox texto,,"Ud. lleva este tiempo sobre la tierra"
En este codigo primero ingresaremos nuestro cumpleaños, una vez ingresado el valor a la variable nacim pasaremos a ingresar en la variable texto los resultados de datediff con respecto a nuestro nacimiento (nacim) y now, en el primer caso agregaremos los años, luego los trimestres, despues los dias, luego las horas, despues los minutos y finalmente los segundos, una vez hecho eso lo mostraremos en pantalla, veamos su salida

Para que nos puede ser util esta funcion? Como nos permite calcular la diferencia entre dos fechas esto crea un valor para poder aplicarlo sobre un filtro en una busqueda o marcar un limite en un tema que veremos mas adelante.
En resumen, hoy hemos visto las estructuras del tiempo, como manipularlas, como separarlas, ya sea por distintas funciones, o por alguna funcion que nos permite trabajar por medio de filtros para obtener el dato, hemos visto como se puede se modificar una fecha de forma mas simple a lo visto en el post anterior y como podemos obtener los distintos resultados de la diferencia entre dos fechas, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.
Tambien podes comprar mi libro sobre VBscript en Amazon


Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50