none
Obtener fecha de dia Lunes en una semana RRS feed

  • Pregunta

  • Hola a todos. Estoy teniendo un problema. Tengo un DateTimePicker .. al seleccionar una fecha (por ejemplo, 22 de Abril de 2011, dia Viernes) necesito saber el lunes de esa semana. Para este ejemplo, la consulta me deberia devolver Lunes 18 de Abril) Tomando al lunes como primer dia de la semana. Alguien tiene idea como hacer esto ??? Gracias !
    viernes, 22 de abril de 2011 21:40

Respuestas

  • "rlavisse" preguntó:

    > necesito saber el lunes de esa semana. Para este ejemplo, la consulta
    > me deberia devolver Lunes 18 de Abril) Tomando al lunes como primer
    > dia de la semana. Alguien tiene idea como hacer esto ???

    Por supuesto que se puede hacer. Simplemente tienes que conocer los días que tienes que restar a la fecha seleccionada en el control DateTimePicker. Para ello te puede servir la siguiente función, donde figuran los comentarios oportunos:

     

    Imports System.Globalization
    
     ''' <summary>
     ''' Obtiene el primer día de la semana correspondiente a la fecha indicada.
     ''' </summary>
     ''' <author>Enrique Martínez Montejo - 2011</author>
     ''' <param name="currentDate">Valor DateTime correspondiente a la fecha actual.</param>
     ''' <returns></returns>
     ''' <remarks></remarks>
     Public Function GetFirstDayOfWeek(ByVal currentDate As DateTime) As DateTime
    
     ' Referenciamos la cultura invariable.
     '
     Dim ci As CultureInfo = CultureInfo.InvariantCulture
    
     ' Obtenemos el día de la semana correspondiente a la fecha actual.
     '
     Dim ds As DayOfWeek = ci.Calendar.GetDayOfWeek(currentDate)
    
     ' Como el primer día de la semana es el 0 (Domingo), construimos
     ' un array para conocer los días que hay que restar de la fecha.
     ' Así, si es Domingo (0) restaremos 6 días, si es Sábado (6)
     ' restaremos 5 días, y si es Lunes (1) restaremos 0 días.
     ' Recordar que en .NET los índices de los arrays están en base cero.
     '
     Dim dias() As Integer = {6, 0, 1, 2, 3, 4, 5}
    
     ' De la fecha actual restamos los días correspondientes.
     '
     Return currentDate.Subtract(New TimeSpan(dias(ds), 0, 0, 0))
    
     End Function
     

    Cuando desees obtener el primer día de la semana, llamarías a la función de la siguiente manera:

            ' Fecha seleccionada en el control DataTimePicker
            Dim fecha As DateTime = DateTimePicker1.Value.Date

            Dim fechaLunes As DateTime = GetFirstDayOfWeek(fecha)

            MessageBox.Show(fechaLunes.ToShortDateString)

    ¡Fácil! ;-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]



    sábado, 23 de abril de 2011 8:39
    Moderador
  • "AdriGzz" preguntó:

    > requiero hacer es que el usuario debe seleccionar de unos
    > checkbox el dia que desee de entre LM,MI,J y V, y de una
    > lista selecciona el año, entonces al momento de dar click
    > a un boton, si el usuario ha seleccionado miercoles 2011,
    > debo de obtener la fecha del primer miercoles del año, ...

    Hola:

    Si lo que deseas es obtener la fecha correspondiente a un día de la semana concreto correspondiente al intervalo entre el día 1 de enero y el 7 de enero de un año cualquiera, para nada te va a servir la función que he indicado anteriormente. Para ello te servirá la siguiente:

        Public Function ObtenerFecha( _
                ByVal dw As DayOfWeek, _
                ByVal year As Integer) As DateTime

            ' Referenciamos la cultura actual.
            '
            Dim ci As CultureInfo = Application.CurrentCulture

            Dim fecha As DateTime

            ' Recorremos seis días para obtener la fecha correspondiente
            ' al día de la semana especificado.
            '
            For dia As Integer = 1 To 7

                fecha = New DateTime(year, 1, dia)

                ' Dia de la semana correspondiente al día actual
                '
                Dim ds As DayOfWeek = ci.Calendar.GetDayOfWeek(fecha)

                ' Si se corresponde con el día de la semana especificado
                ' devolvemos la fecha.
                '
                If (ds = dw) Then Return fecha

            Next

            ' Lo siguiente nunca se llegará a ejecutar
            '
            Return fecha

        End Function

    Ahora, para obtener la fecha correspondiente al primer miércoles del año 2011, llamarías a la función de la siguiente manera:

        Dim fecha As DateTime = ObtenerFecha(DayOfWeek.Wednesday, 2011)

        MessageBox.Show(fecha.ToShortDateString)

    En lugar de utilizar controles CheckBox para los días de la semana, utiliza controles RadioButton para que solamente se pueda seleccionar un día de la semana. Dependiendo del control RadioButton seleccionado por el usuario, obtendrías el valor «DayOfWeek» que deberás de pasar a la función. El número del año me imagino que sabrás cómo obtenerlo de la lista de años.

    > ... New TimeSpan(dias(ds), 0, 0, 0) que significa cada posicion
    > del timespan (posicion1, posicion2, posicion3, posicion4)

    El primer parámetro significa el día, el segundo las horas, el tercero los minutos y el cuarto los segundos.

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]


    jueves, 28 de abril de 2011 10:42
    Moderador
  • hola

    podrias probar algo como esto

    Private Sub button1_Click(sender As Object, e As EventArgs)

        Dim diaLunes As DateTime = ObtenerPrimerDiaSemana(Convert.ToDateTime("22/04/2011"))

    End Sub


    Public Shared Function ObtenerPrimerDiaSemana(diaSemana As DateTime) As DateTime

        Dim primerDiaSemana As DateTime = diaSemana.Date
        While primerDiaSemana.DayOfWeek <> DayOfWeek.Monday
            primerDiaSemana = primerDiaSemana.AddDays(-1)
        End While

        Return primerDiaSemana

    End Function

     

    lo he probado y funciona bien y es bastante reducido en codigo, basicamente recorre los dias restando uno hasta que sea el lunes partiendo desde la fecha que le proporcionas

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 24 de abril de 2011 0:58
  • Hola:

    Ya puestos, otra manera de obtener el lunes de una semana es la siguiente:

    Lunes = Fecha - DiaSemana(Fecha) + 1

    En VB.NET usando las funciones de compatibilidad con VB sería:

    FechaLunes = DateAdd(DateInterval.Day, -Weekday(Fecha, FirstDayOfWeek.Monday) + 1, Fecha)

    Saludos

     

    jueves, 28 de abril de 2011 11:47

Todas las respuestas

  • Puedes cambiar cultura de tu DateTimePicker,para que acepte el dia Lunes, como primer dia:

    http://msdn.microsoft.com/es-es/library/aa983603(v=vs.71).aspx

    http://msdn.microsoft.com/es-es/library/h2ef6zxz(v=vs.85).aspx

    http://es.w3support.net/index.php?db=so&id=241964

     

    Espero sea de utilidad.

     

     


    Programador .NET - Desarrollador 5 Estrellas.
    viernes, 22 de abril de 2011 21:43
  • Gracias Luis .. pero no es eso lo que estoy buscando.

    Mira :   .....   Tengo un DateTimePicker .. al seleccionar una fecha (por ejemplo, 22 de Abril de 2011, dia Viernes) necesito saber el lunes de

    esa semana. Para este ejemplo, la consulta me deberia devolver Lunes 18 de Abril) Tomando al lunes como primer dia de la semana

     

    Gracias !

    viernes, 22 de abril de 2011 22:26
  • Buenas rlavisse.

    Puedes obtener el día de la semana como numérico accediendo al método DayOfWeek de la clase DateTime.

    Por ejemplo si es Lunes devolverá 1 (es posible que te devuelva 0 por la configuración regional, asegúrate de saber que devuelve)

    Una vez que te de el dia de la semana podrías hacer una resta de dias, algo así:

     

    If vFecha.DayOfWeek = 2 Then
    
    MessageBox.Show(DateAdd(DateInterval.Day, -1, vFecha).ToString())
    
    ElseIf vFecha.DayOfWeek = 3 Then
    
    MessageBox.Show(DateAdd(DateInterval.Day, -2, vFecha).ToString())
    
    ElseIf
    
    ...
    End If
    

     

    Un saludo.


    http://www.lopezatienza.es

    viernes, 22 de abril de 2011 22:33
  • "rlavisse" preguntó:

    > necesito saber el lunes de esa semana. Para este ejemplo, la consulta
    > me deberia devolver Lunes 18 de Abril) Tomando al lunes como primer
    > dia de la semana. Alguien tiene idea como hacer esto ???

    Por supuesto que se puede hacer. Simplemente tienes que conocer los días que tienes que restar a la fecha seleccionada en el control DateTimePicker. Para ello te puede servir la siguiente función, donde figuran los comentarios oportunos:

     

    Imports System.Globalization
    
     ''' <summary>
     ''' Obtiene el primer día de la semana correspondiente a la fecha indicada.
     ''' </summary>
     ''' <author>Enrique Martínez Montejo - 2011</author>
     ''' <param name="currentDate">Valor DateTime correspondiente a la fecha actual.</param>
     ''' <returns></returns>
     ''' <remarks></remarks>
     Public Function GetFirstDayOfWeek(ByVal currentDate As DateTime) As DateTime
    
     ' Referenciamos la cultura invariable.
     '
     Dim ci As CultureInfo = CultureInfo.InvariantCulture
    
     ' Obtenemos el día de la semana correspondiente a la fecha actual.
     '
     Dim ds As DayOfWeek = ci.Calendar.GetDayOfWeek(currentDate)
    
     ' Como el primer día de la semana es el 0 (Domingo), construimos
     ' un array para conocer los días que hay que restar de la fecha.
     ' Así, si es Domingo (0) restaremos 6 días, si es Sábado (6)
     ' restaremos 5 días, y si es Lunes (1) restaremos 0 días.
     ' Recordar que en .NET los índices de los arrays están en base cero.
     '
     Dim dias() As Integer = {6, 0, 1, 2, 3, 4, 5}
    
     ' De la fecha actual restamos los días correspondientes.
     '
     Return currentDate.Subtract(New TimeSpan(dias(ds), 0, 0, 0))
    
     End Function
     

    Cuando desees obtener el primer día de la semana, llamarías a la función de la siguiente manera:

            ' Fecha seleccionada en el control DataTimePicker
            Dim fecha As DateTime = DateTimePicker1.Value.Date

            Dim fechaLunes As DateTime = GetFirstDayOfWeek(fecha)

            MessageBox.Show(fechaLunes.ToShortDateString)

    ¡Fácil! ;-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]



    sábado, 23 de abril de 2011 8:39
    Moderador
  • hola

    podrias probar algo como esto

    Private Sub button1_Click(sender As Object, e As EventArgs)

        Dim diaLunes As DateTime = ObtenerPrimerDiaSemana(Convert.ToDateTime("22/04/2011"))

    End Sub


    Public Shared Function ObtenerPrimerDiaSemana(diaSemana As DateTime) As DateTime

        Dim primerDiaSemana As DateTime = diaSemana.Date
        While primerDiaSemana.DayOfWeek <> DayOfWeek.Monday
            primerDiaSemana = primerDiaSemana.AddDays(-1)
        End While

        Return primerDiaSemana

    End Function

     

    lo he probado y funciona bien y es bastante reducido en codigo, basicamente recorre los dias restando uno hasta que sea el lunes partiendo desde la fecha que le proporcionas

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 24 de abril de 2011 0:58
  • "Leandro Tuttini" escribió:

    > lo he probado y funciona bien y es bastante reducido en codigo,

    ¡Hombre! Si a mi función GetFirstDayOfWeek le quitas los comentarios, los cuales NO SE COMPILAN, se quedan en CUATRO LÍNEAS DE CÓDIGO: igual número de líneas que tu función ObtenerPrimerDiaSemana.

    > basicamente recorre los dias restando uno hasta que sea el
    > lunes partiendo desde la fecha que le proporcionas

    Mi función NO RECORRE los días, si no que lo CALCULA DIRECTAMENTE, sin necesidad de bucle alguno.

    ¡Pero, nada! Está bien que la gente se "caliente la cabeza" buscando nuevas funciones que hagan lo mismo que las que ya se han publicado con anterioridad, aunque eso sí, de diferente manera. Digamos que son, "otras alternativas" :-D

     


    Enrique Martínez
      [MS MVP - VB]


    domingo, 24 de abril de 2011 5:22
    Moderador
  • Hola SoftJaén fue excelente tu respuesta, aunque la verdad no entienedo como funciona, yo no quiero saber el lunes , de la semana pero creo  que tu funcion me ayudara, lo que requiero hacer es que el usuario debe seleccionar de unos checkbox el dia que desee de entre LM,MI,J y V, y de una lista selecciona el año, entonces al momento de dar click a un boton, si el usuario ha seleccionado miercoles 2011, debo de obtener la fecha del primer miercoles del año, me podras ayudar con eso. te lo agradecere mucho. o si me explicas porfavor

    New TimeSpan(dias(ds), 0, 0, 0) que significa cada posicion del timespan (posicion1, posicion2, posicion3, posicion4)

    gracias


    miércoles, 27 de abril de 2011 15:12
  • "AdriGzz" preguntó:

    > requiero hacer es que el usuario debe seleccionar de unos
    > checkbox el dia que desee de entre LM,MI,J y V, y de una
    > lista selecciona el año, entonces al momento de dar click
    > a un boton, si el usuario ha seleccionado miercoles 2011,
    > debo de obtener la fecha del primer miercoles del año, ...

    Hola:

    Si lo que deseas es obtener la fecha correspondiente a un día de la semana concreto correspondiente al intervalo entre el día 1 de enero y el 7 de enero de un año cualquiera, para nada te va a servir la función que he indicado anteriormente. Para ello te servirá la siguiente:

        Public Function ObtenerFecha( _
                ByVal dw As DayOfWeek, _
                ByVal year As Integer) As DateTime

            ' Referenciamos la cultura actual.
            '
            Dim ci As CultureInfo = Application.CurrentCulture

            Dim fecha As DateTime

            ' Recorremos seis días para obtener la fecha correspondiente
            ' al día de la semana especificado.
            '
            For dia As Integer = 1 To 7

                fecha = New DateTime(year, 1, dia)

                ' Dia de la semana correspondiente al día actual
                '
                Dim ds As DayOfWeek = ci.Calendar.GetDayOfWeek(fecha)

                ' Si se corresponde con el día de la semana especificado
                ' devolvemos la fecha.
                '
                If (ds = dw) Then Return fecha

            Next

            ' Lo siguiente nunca se llegará a ejecutar
            '
            Return fecha

        End Function

    Ahora, para obtener la fecha correspondiente al primer miércoles del año 2011, llamarías a la función de la siguiente manera:

        Dim fecha As DateTime = ObtenerFecha(DayOfWeek.Wednesday, 2011)

        MessageBox.Show(fecha.ToShortDateString)

    En lugar de utilizar controles CheckBox para los días de la semana, utiliza controles RadioButton para que solamente se pueda seleccionar un día de la semana. Dependiendo del control RadioButton seleccionado por el usuario, obtendrías el valor «DayOfWeek» que deberás de pasar a la función. El número del año me imagino que sabrás cómo obtenerlo de la lista de años.

    > ... New TimeSpan(dias(ds), 0, 0, 0) que significa cada posicion
    > del timespan (posicion1, posicion2, posicion3, posicion4)

    El primer parámetro significa el día, el segundo las horas, el tercero los minutos y el cuarto los segundos.

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]


    jueves, 28 de abril de 2011 10:42
    Moderador
  • Hola:

    Ya puestos, otra manera de obtener el lunes de una semana es la siguiente:

    Lunes = Fecha - DiaSemana(Fecha) + 1

    En VB.NET usando las funciones de compatibilidad con VB sería:

    FechaLunes = DateAdd(DateInterval.Day, -Weekday(Fecha, FirstDayOfWeek.Monday) + 1, Fecha)

    Saludos

     

    jueves, 28 de abril de 2011 11:47