Control de fechas

Descripción general

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)

[TOC] Tabla de Contenidos


↑↑↑

Control de fechas

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


↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquin Medina Serrano
Ésta página es española