El siguiente código comprueba si una fecha está bien formada, si es coherente, es decir, un mes de febrero no puede tener 30 días. Un año no puede tener el valor cero (0)
En .NET, existe el tipo de datos Date y DateTime que contienen y manejan fechas, pero en ocasiones necesitamos manejar fechas "a la antigua", es decir introduciendo "manualmente" el año, el mes y el día, por lo que necesitamos una función que se encargue de comprobar si la fecha introducida está bien formada, es una fecha coherente, o dicho de otro modo, si es una fecha posible. Evidentemente, siempre podemos crear un objeto Date (o DateTime) con los valores año, mes, día, y si se crean sin problemas, quiere decir que la fecha es buena, si aparece algún error, la fecha no está bien formada.
El código realiza las siguientes comprobaciones:
La función devuelve un valor booleano que indica:
' ------------------------------------------------- Option Explicit On Option Strict On Option Infer Off Option Compare Binary Namespace Util.Fechas Public NotInheritable Class ControlFechas Private Sub New() ' no hacer nada ' impedir la instancia de esta clase End Sub ''' <summary> ''' Comprueba que los datos de la fecha sean coherentes ''' </summary> ''' <param name="año"> Año (El año no puede ser cero, puede ser positivo o negativo pero no cero)</param> ''' <param name="mes"> Mes (del 1 al 12). </param> ''' <param name="dia"> Día (del 1 al número de días del mes). </param> ''' <returns> ''' <para>Un valor lógico que indica:</para> ''' <para>TRUE: la fecha es correcta</para> ''' <para>FALSE: la fecha no es correcta</para> ''' </returns> ''' <remarks> ''' <remarks> ''' <para>La comprobación que realiza la función es la siguiente: </para> ''' <para>El año no puede tomar el valor cero (0), no existe el año cero ''' para ninguna fecha del calendario gregoriano. ''' Por lo demás no existe ninguna limitación de valor tanto en ''' sentido positivo como negativo, únicamente le valor ''' máximo y mínimo de un numero [Integer] </para> ''' <para>El mes debe estar comprendido entre 1 y 12</para> ''' <para>El día debe estar comprendido entre 1 y 31, con las variantes ''' de los meses que tienen 30 días y el mes de ''' febrero con 28 o 29 días según el año sea bisiesto o no</para> '''</remarks> ''' <code> ''' <para>Usa el Algoritmo bisiesto - De Wikipedia, la enciclopedia libre</para> ''' <para> http://es.wikipedia.org/wiki/Algoritmo_bisiesto</para> ''' </code> ''' <autor> Joaquin medina Serrano: joaquin@medina.name</autor> ''' <rights> Licencia Creative Commons Compartir-Igual 3.0</rights> ''' <Creacion>2010-09-16T22:01:00</Creacion> '''</remarks> Public Overloads Shared Function LaFechaEsCorrecta( _ ByVal año As Integer, _ ByVal mes As Integer, _ ByVal dia As Integer) As Boolean '------------------------------- ' El año no puede ser cero, puede ser positivo o negativo pero no cero If año = 0 Then Return False ' hay un error >>>>>>>>>>> ' El mes y/o el día no puede ser menor de 1 If mes < 1 Or dia < 1 Then Return False ' hay un error >>>>>>>>>>> '------------------------------- If mes = 2 Then ' ¿¿ El año es bisiesto?? If año Mod 4 = 0 _ And (año Mod 100 <> 0 Or año Mod 400 = 0) Then If dia > 29 Then Return False ' hay un error >>>>>>>>>>> Else If dia > 28 Then Return False ' hay un error >>>>>>>>>>> End If End If '------------------------------- ' Los meses abril(4), junio(6), septiembre(9), noviembre(11) tienen 30 días If (mes = 4 OrElse mes = 6 OrElse mes = 9 OrElse mes = 11) Then If dia > 30 Then Return False ' hay un error >>>>>>>>>>> End If '------------------------------- If (mes = 1 OrElse mes = 3 OrElse mes = 5 OrElse mes = 7 OrElse _ mes = 8 OrElse mes = 10 OrElse mes = 12) Then If dia > 31 Then Return False ' hay un error >>>>>>>>>>> End If '------------------------------- Return True ' La fecha es correcta, esta bien >>>>>>>>>>> End Function ''' <summary> ''' Comprueba si la fecha es correcta ''' </summary> ''' <param name="año"> Año (El año no puede ser cero, puede ser positivo o negativo pero no cero)</param> ''' <param name="mes"> Mes (del 1 al 12). </param> ''' <param name="dia"> Día (del 1 al número de días del mes). </param> ''' <param name="hora"> Horas (de 0 a 23). </param> ''' <param name="min"> Minutos (de 0 a 59). </param> ''' <param name="seg"> Segundos (de 0 a 59). </param> ''' <param name="mls"> Milisegundos (de 0 a 999). </param> ''' <param name="outputException"> ''' <para>Valor de retorno </para> ''' <para>Devuelve una excepción del tipo [ArgumentOutOfRangeException] ''' con los valores del error</para> ''' <para>Devuelve un valor [Nothing] si la fecha es correcta</para> ''' </param> ''' <returns> ''' <para>Devuelve un valor lógico que indica </para> ''' <para>TRUE: La fecha es correcta</para> ''' <para>FALSE: la fecha no es buena tiene errores de coherencia</para> ''' </returns> ''' <remarks> ''' <para>La función comprueba la fecha. El resultado de esa comprobación ''' lo devuelve de dos maneras: por una parte con el valor de retorno, ''' que es un valor lógico, y por otra con un parámetro [ByRef], ''' que devuelve el valor [Nothing] si la fecha es correcta o una ''' excepción del tipo [ArgumentOutOfRangeException] ''' si la fecha no es correcta. </para> ''' ''' <para>La comprobación que realiza la función es la siguiente: </para> ''' <para>El año no puede tomar el valor cero (0), no existe el año cero ''' para ninguna fecha del calendario gregoriano. ''' Por lo demás no existe ninguna limitación de valor tanto en ''' sentido positivo como negativo, únicamente le valor ''' máximo y mínimo de un numero [Integer] </para> ''' <para>El mes debe estar comprendido entre 1 y 12</para> ''' <para>El día debe estar comprendido entre 1 y 31, con las variantes ''' de los meses que tienen 30 días y el mes de ''' febrero con 28 o 29 días según el año sea bisiesto o no</para> ''' <para>La hora tiene un rango de valores entre 0 y 23. ''' La hora 24 es la hora cero (0). </para> ''' <para>Los minutos y segundos deben estar comprendidos entre 0 y 59</para> ''' <para>Los milisegundos deben estar entre 0 y 999. </para> ''' ''' <code> ''' <para> Usa el Algoritmo bisiesto - De Wikipedia, la enciclopedia libre</para> ''' <para> http://es.wikipedia.org/wiki/Algoritmo_bisiesto</para> ''' </code> ''' <autor> Joaquin medina Serrano: joaquin@medina.name</autor> ''' <rights> Licencia Creative Commons Compartir-Igual 3.0</rights> ''' <Creacion>2010-09-16T22:01:00</Creacion> '''</remarks> Public Overloads Shared Function LaFechaEsCorrecta( _ ByVal año As Integer, ByVal mes As Integer, ByVal dia As Integer, _ ByVal hora As Integer, ByVal min As Integer, ByVal seg As Integer, ByVal mls As Integer, _ ByRef outputException As ArgumentOutOfRangeException) As Boolean ' Variables para devolver los resultados outputException = Nothing ' no hay errores ' *** Comprobacion del año *** If año = 0 Then outputException = New ArgumentOutOfRangeException( _ "año", año, "en una fecha, un año NUNCA puede tomar el valor cero (0)") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If ' *** Comprobacion de los meses *** If mes < 1 OrElse mes > 12 Then outputException = New ArgumentOutOfRangeException( _ "mes", mes, "El rango de los meses es [1 hasta 12]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If ' *** Comprobacion de los dias del mes *** If dia < 1 Then outputException = New ArgumentOutOfRangeException( _ "dia", dia, "El rango de los dias es [1 hasta 31]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If ' mes febrero If mes = 2 Then If año Mod 4 = 0 _ And (año Mod 100 <> 0 Or año Mod 400 = 0) Then If dia > 29 Then outputException = New ArgumentOutOfRangeException( _ "dia", dia, "(Año Bisiesto) El rango del mes de febrero es [1 hasta 29]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If Else If dia > 28 Then outputException = New ArgumentOutOfRangeException( _ "dia", dia, "(Año normal) El rango del mes de febrero es [1 hasta 28]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If End If End If If (mes = 4 OrElse mes = 6 OrElse mes = 9 OrElse mes = 11) Then If dia > 30 Then outputException = New ArgumentOutOfRangeException( _ "dia", dia, "El rango de este mes = [" & mes & "] es [1 hasta 30]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If End If If (mes = 1 OrElse mes = 3 OrElse mes = 5 OrElse mes = 7 OrElse _ mes = 8 OrElse mes = 10 OrElse mes = 12) Then If dia > 31 Then outputException = New ArgumentOutOfRangeException( _ "dia", dia, "El rango de este mes = [" & mes & "] es [1 hasta 31]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If End If ' *** Comprobacion de la hora (completa) *** If hora < 0 OrElse hora > 23 Then outputException = New ArgumentOutOfRangeException( _ "hora", hora, "El rango de las horas es [0 hasta 23]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If If min < 0 OrElse min > 59 Then outputException = New ArgumentOutOfRangeException( _ "min", min, "El rango de los minutos es [0 hasta 59]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If If seg < 0 OrElse seg > 59 Then outputException = New ArgumentOutOfRangeException( _ "seg", seg, "El rango de los segundos es [0 hasta 59]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If If mls < 0 OrElse mls > 999 Then outputException = New ArgumentOutOfRangeException( _ "mls", mls, "El rango de los milisegundos es [0 hasta 999]") Return False ' hay un error ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End If Return True ' Todo correcto ' >>>>>>>>>>>>>>>>>>>>>>>>>>> End Function ''' <summary> ''' Comprueba si la fecha es correcta ''' </summary> ''' <param name="año"> Año (El año no puede ser cero, puede ser positivo o negativo pero no cero)</param> ''' <param name="mes"> Mes (del 1 al 12). </param> ''' <param name="dia"> Día (del 1 al número de días del mes). </param> ''' <param name="outputException"> ''' <para>Valor de retorno </para> ''' <para>Devuelve una excepción del tipo [ArgumentOutOfRangeException] ''' con los valores del error</para> ''' <para>Devuelve un valor [Nothing] si la fecha es correcta</para> ''' </param> ''' <returns> ''' <para>Devuelve un valor lógico que indica </para> ''' <para>TRUE: La fecha es correcta</para> ''' <para>FALSE: la fecha no es buena tiene errores de coherencia</para> ''' </returns> ''' <remarks> ''' <para>La comprobación que realiza la función es la siguiente: </para> ''' <para>El año no puede tomar el valor cero (0), no existe el año cero ''' para ninguna fecha del calendario gregoriano. ''' Por lo demás no existe ninguna limitación de valor tanto en ''' sentido positivo como negativo, únicamente le valor ''' máximo y mínimo de un numero [Integer] </para> ''' <para>El mes debe estar comprendido entre 1 y 12</para> ''' <para>El día debe estar comprendido entre 1 y 31, con las variantes ''' de los meses que tienen 30 días y el mes de ''' febrero con 28 o 29 días según el año sea bisiesto o no</para> '''</remarks> Public Overloads Shared Function LaFechaEsCorrecta( _ ByVal año As Integer, ByVal mes As Integer, ByVal dia As Integer, _ ByRef outputException As ArgumentOutOfRangeException) As Boolean Const CERO As Integer = 0 Return LaFechaEsCorrecta(año, mes, dia, CERO, CERO, CERO, CERO, outputException) End Function End Class End Namespace
© 1997 - - La Güeb de Joaquín | |||||
Joaquin Medina Serrano
|
|||||
|