Saltar al contenido

Intervalo de fechas por número de semana Golang

Puede que se de el caso de que halles algún fallo en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes añadir el código al trabajo final.

Solución:

Prefacio:Time.ISOWeek() le devuelve el número de la semana que comienza el lunes, por lo que responderé a su pregunta que también maneja las semanas que comienzan el lunes. Modifíquelo según sus necesidades si desea que funcione con semanas a partir del domingo.

Lancé esta utilidad en github.com/icza/goxver timex.WeekStart().


La biblioteca estándar no proporciona una función que le devuelva el rango de fechas de una semana determinada (año + número de semana). Así que tenemos que construir uno nosotros mismos.

Y no es tan difícil. Podemos comenzar desde la mitad del año, alinearnos con el primer día de la semana (lunes), obtener la semana de este valor de tiempo y corregir: sumar tantos días como la diferencia de la semana multiplicada por 7.

Así es como podría verse:

func WeekStart(year, week int) time.Time 
    // Start from the middle of the year:
    t := time.Date(year, 7, 1, 0, 0, 0, 0, time.UTC)

    // Roll back to Monday:
    if wd := t.Weekday(); wd == time.Sunday 
        t = t.AddDate(0, 0, -6)
     else 
        t = t.AddDate(0, 0, -int(wd)+1)
    

    // Difference in weeks:
    _, w := t.ISOWeek()
    t = t.AddDate(0, 0, (week-w)*7)

    return t

Probándolo:

fmt.Println(WeekStart(2018, 1))
fmt.Println(WeekStart(2018, 2))
fmt.Println(WeekStart(2019, 1))
fmt.Println(WeekStart(2019, 2))

Salida (pruébalo en el Go Playground):

2018-01-01 00:00:00 +0000 UTC
2018-01-08 00:00:00 +0000 UTC
2018-12-31 00:00:00 +0000 UTC
2019-01-07 00:00:00 +0000 UTC

Una buena propiedad de este WeekStart() implementación es que maneja fuera de rango semanas muy bien. Es decir, si pasa 0 para la semana, se interpretará como la última semana del año anterior. si pasas -1 para la semana, se designará la penúltima semana del año anterior. De manera similar, si pasa la semana máxima del año más 1, se interpretará como la primera semana del próximo año, etc.

Lo anterior WeekStart() La función solo devuelve el primer día de la semana dada (lunes), porque el último día de la semana siempre es su primer día + 6 días.

Si también necesitamos el último día:

func WeekRange(year, week int) (start, end time.Time) 
    start = WeekStart(year, week)
    end = start.AddDate(0, 0, 6)
    return

Probándolo:

fmt.Println(WeekRange(2018, 1))
fmt.Println(WeekRange(2018, 2))
fmt.Println(WeekRange(2019, 1))
fmt.Println(WeekRange(2019, 2))

Salida (pruébalo en el Go Playground):

2018-01-01 00:00:00 +0000 UTC 2018-01-07 00:00:00 +0000 UTC
2018-01-08 00:00:00 +0000 UTC 2018-01-14 00:00:00 +0000 UTC
2018-12-31 00:00:00 +0000 UTC 2019-01-06 00:00:00 +0000 UTC
2019-01-07 00:00:00 +0000 UTC 2019-01-13 00:00:00 +0000 UTC

Si para ti ha sido de ayuda nuestro post, sería de mucha ayuda si lo compartes con otros seniors de este modo contrubuyes a dar difusión a esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *