Fechas en ASP .NET con VB

Calcular la diferencia entre 2 fechas en una página dinámica aspx usando DateTime y DateDiff, en Visual Studio 2017 con VB

Este es un ejercicio muy sencillo para ilustrar el uso de la función DateDiff que permite calcular el número de días existentes entre 2 fechas determinadas.

En la página aspx se crean unos elementos DropDownList (listas desplegables) para ir seleccionando día, mes y año que se compararán con la fecha actual. Por ejemplo, la lista que corresponde a los meses del año puede crearse con este código:

<asp:DropDownList ID="ListMes" runat="server" AutoPostBack="True" Font-Size="Small" Font-Names="Verdana">
	<asp:ListItem Value="Enero">Enero</asp:ListItem>
	<asp:ListItem Value="Febrero">Febrero</asp:ListItem>
	<asp:ListItem Value="Marzo">Marzo</asp:ListItem>
	<asp:ListItem Value="Abril">Abril</asp:ListItem>
	<asp:ListItem Value="Mayo">Mayo</asp:ListItem>
	<asp:ListItem Value="Junio">Junio</asp:ListItem>
	<asp:ListItem Value="Julio">Julio</asp:ListItem>
	<asp:ListItem Value="Agosto">Agosto</asp:ListItem>
	<asp:ListItem Value="Septiembre">Septiembre</asp:ListItem>
	<asp:ListItem Value="Octubre">Octubre</asp:ListItem>
	<asp:ListItem Value="Noviembre">Noviembre</asp:ListItem>
	<asp:ListItem Value="Diciembre">Diciembre</asp:ListItem>
</asp:DropDownList></td>

En el archivo de código VB la fecha actual se obtiene y se muestra así:

' variables para la fecha (día, mes y año)
Protected f As DateTime

'declaraciones y asignaciones de fechas, Now es la fecha actual
f = Now
'
'mostrar la fecha actual formateada para día + mes con el nombre entero + año con 4 cifras
LbHoy.Text = Format(f, "d/MMMM/yyyy")

Los valores seleccionados en las listas desplegables día, mes y año han de ser convertidos al tipo DateTime que es el tipo de fecha actual para que DateDiff pueda actuar sobre ellas:

'crear una fecha a partir de los valores seleccionados en las listas desplegables
'equivalente a escribir: Dim fa As Date = Convert.ToDateTime("día mes, año")
Dim fa As Date = Convert.ToDateTime(ListDia.SelectedValue &amp;
" " &amp; ListMes.SelectedValue &amp; ", " &amp; ListYear.SelectedValue)
'variable para almacenar la diferencia de fechas
Dim fb As Integer
fb = DateDiff(DateInterval.Day, Date.Today, fa)
'para evitar que la cifra salga como nº negativo cuando fa es anterior a hoy
If fb < 0 Then
	fb = (-fb)
End If
'mostrar la diferencia en días
LbDiff.Text = "<font size=2 color=black>Días que separan el día de hoy " &amp;
"de la fecha seleccionada: </font><b>" &amp; fb &amp; "</b>"

Se comprueba si febrero es bisiesto o no y cuales son los meses que tiene 30 días para detectar errores al elegir en la lista desplegable más de 28-29-30 días según cada caso. Podemos decir que cada 4 años hay uno bisiesto, cada 100 años no lo hay y cada 400 sí lo hay, esto se pude expresar con el código

'si no es bisiesto
If Not (valorAño Mod 4 = 0 And valorAño Mod 100 <> 0 Or valorAño Mod 400 = 0) Then

Este es el bloque completo de la comprobación.

' para avisar al seleccionar un día incorrecto según el mes elegido
Dim ordenMes As Integer
ordenMes = ListMes.SelectedIndex 'mes seleccionado
Dim valorDia As Integer
valorDia = CInt(ListDia.SelectedValue) 'día seleccionado
Dim valorAño As Integer
valorAño = CInt(ListYear.SelectedValue) 'año seleccionado
' dependiendo deldía seleccionado
Select Case ordenMes
Case 1 'mes febrero
    If Not (valorAño Mod 4 = 0 And valorAño Mod 100 <> 0 Or valorAño Mod 400 = 0) Then 'si no es bisiesto
	If CInt((ListDia.SelectedValue) > 28) Then
	    LbDiff.Text = ""
	    LbAviso.Text = "ERROR: ¡Febrero tiene 28 días!"
	    Return
	End If
    Else 'si es bisiesto
	If CInt((ListDia.SelectedValue) > 29) Then
	    LbDiff.Text = ""
	    LbAviso.Text = "ERROR: ¡Febrero bisiesto tiene 29 días!"
	    Return
	End If
    End If
Case 3, 5, 8, 10 'meses de 30 días
    If CInt((ListDia.SelectedValue) > 30) Then
	LbDiff.Text = ""
	LbAviso.Text = "ERROR: ¡Este mes sólo tiene 30 días!"
	Return
    End If
End Select

Se desea que las listas desplegables contengan la fecha actual para realizar el cálculo inicial al cargar la página, se consigue con este código:

' Código para hacer que los cuados de lista arranquen con la fecha actual
' la propiedad Now devuelve el mes como entero de 1 a 12 pero así no lo captura bien la lista desplegable de los meses de la página aspx
' convertimos el nº en el nombre del mes con la primera letra en mayúsculas para que coincida exactamente con el nombre de la lista desplegable
Dim mes As String
mes = f.ToString("MMMM")
mes = mes.Substring(0, 1).ToUpper() &amp; mes.Substring(1).ToLower()
ListDia.SelectedValue = f.Day
ListMes.SelectedValue = mes
ListYear.SelectedValue = f.Year

Puedes descargar el proyecto completo desde aquí.

2 respuesta a “Fechas en ASP .NET con VB”

  1. Hay alguna manera de saber si el año es bisiesto dentro de las funciones del propio lenguaje visual basic? Veo que recurres a un cálculo matemático basado en las ocasiones en que el año es bisiesto pero me gustaría hacerlo por código más específico del lenguaje.

  2. Sí, existe la función DateTime.IsLeapYear que devuelve True si el año es bisiesto, en caso contrario devuelve False.
    Podrías pasarle un año en número, por ej.
    If (DateTime.IsLeapYear(2000))
    o con la fecha actual
    If (Date.IsLeapYear(Now.Year)).

Deja un comentario

Tu dirección de correo electrónico no será publicada.