Estimado Armando,
Programado por Google Antigravity usando el repo de Harbour como carpeta de trabajo:
week_utils.prg
/*
* week_utils.prg
* Funciones de utilidad para cálculo de semanas de Sábado a Viernes.
*/
FUNCTION WeekSatToFri( dDate )
LOCAL nYear := Year( dDate )
LOCAL dFirstSat := FirstSatOfYear( nYear )
LOCAL nWeek
// Si la fecha es anterior al primer sábado del año, pertenece al año anterior
IF dDate < dFirstSat
nYear--
dFirstSat := FirstSatOfYear( nYear )
ENDIF
// Cálculo: (Diferencia de días / 7) + 1
nWeek := Int( ( dDate - dFirstSat ) / 7 ) + 1
RETURN nWeek
FUNCTION FirstSatOfYear( nYear )
LOCAL dDate := hb_SToD( AllTrim( Str( nYear ) ) + "0101" )
LOCAL nDow := DoW( dDate ) // 1=Dom, 2=Lun, ..., 7=Sab
// Harbour DoW(): 1=Domingo, ..., 7=Sábado
// Si es Sábado (7), ya estamos. Si no, sumamos los días necesarios.
// Días a sumar:
// Dom(1) -> +6
// Lun(2) -> +5
// Mar(3) -> +4
// Mie(4) -> +3
// Jue(5) -> +2
// Vie(6) -> +1
// Sab(7) -> +0
IF nDow < 7
dDate += ( 7 - nDow )
ENDIF
RETURN dDate
test_week.prg
/*
* test_week.prg
* Script de prueba regionalmente independiente para validar la función WeekSatToFri.
*/
PROCEDURE Main()
LOCAL aTests := { ;
{ "20260103", 1, "Primer sábado 2026 (Inicio sem 1)" }, ;
{ "20260109", 1, "Viernes después del primer sábado (Fin sem 1)" }, ;
{ "20260110", 2, "Siguiente sábado (Inicio sem 2)" }, ;
{ "20260101", 52, "Primeros días de 2026 (Pertenecen a 2025)" }, ;
{ "20260102", 52, "Día antes del primer sábado 2026" }, ;
{ "20251231", 52, "Fin de año 2025" } ;
}
LOCAL oTest
LOCAL nResult
LOCAL nErrors := 0
? "Iniciando pruebas de WeekSatToFri (Formato YYYYMMDD)..."
? "------------------------------------------------------"
FOR EACH oTest IN aTests
nResult := WeekSatToFri( hb_SToD( oTest[1] ) )
?? "Fecha: " + oTest[1] + " -> Semana: " + AllTrim(Str(nResult))
IF nResult == oTest[2]
?? " [OK]"
ELSE
?? " [ERROR! Esperado: " + AllTrim(Str(oTest[2])) + "]"
nErrors++
ENDIF
? "Nota: " + oTest[3]
NEXT
? "------------------------------------------------------"
IF nErrors == 0
? "Todas las pruebas pasaron correctamente."
ELSE
? "Se encontraron " + AllTrim(Str(nErrors)) + " errores."
ENDIF
RETURN
Iniciando pruebas de WeekSatToFri (Formato YYYYMMDD)...
Fecha: 20260103 -> Semana: 1 [OK]
Nota: Primer sábado 2026 (Inicio sem 1) Fecha: 20260109 -> Semana: 1 [OK]
Nota: Viernes después del primer sábado (Fin sem 1) Fecha: 20260110 -> Semana: 2 [OK]
Nota: Siguiente sábado (Inicio sem 2) Fecha: 20260101 -> Semana: 52 [OK]
Nota: Primeros días de 2026 (Pertenecen a 2025) Fecha: 20260102 -> Semana: 52 [OK]
Nota: Día antes del primer sábado 2026 Fecha: 20251231 -> Semana: 52 [OK]
Nota: Fin de año 2025
Todas las pruebas pasaron correctamente.