---
name: next_cron_time
kind: function
lang: go
domain: core
version: "1.0.0"
purity: pure
signature: "func NextCronTime(schedule CronSchedule, after time.Time) time.Time"
description: "Calcula la proxima ejecucion de un cron schedule despues de un tiempo dado. Avanza minuto a minuto saltando campos no coincidentes. Retorna zero time si no hay match en 366 dias (schedule imposible)."
tags: [cron, scheduling, time, next, pure, scheduler]
uses_functions: [parse_cron_expr_go_core]
uses_types: [cron_schedule_go_core]
returns: []
returns_optional: false
error_type: ""
imports: [time]
params:
  - name: schedule
    desc: "CronSchedule con listas de minutos, horas, días, etc. válidos"
  - name: after
    desc: "tiempo a partir del cual buscar la próxima ejecución"
output: "time.Time con la próxima ejecución; zero time si no hay match dentro de 366 días"
tested: true
tests:
  - "0 * * * * desde :30 retorna la proxima hora en punto"
  - "@weekly desde viernes retorna proximo domingo a medianoche"
  - "0 9 * * 1-5 desde viernes retorna proximo lunes a las 9"
  - "schedule imposible retorna zero time"
test_file_path: "functions/core/next_cron_time_test.go"
file_path: "functions/core/next_cron_time.go"
---

## Ejemplo

```go
sched, _ := ParseCronExpr("0 * * * *")
after := time.Date(2024, 1, 15, 14, 30, 0, 0, time.UTC)
next := NextCronTime(sched, after)
// next = 2024-01-15 15:00:00 UTC

weekdays, _ := ParseCronExpr("0 9 * * 1-5")
friday := time.Date(2024, 1, 19, 10, 0, 0, 0, time.UTC)  // Friday
next2 := NextCronTime(weekdays, friday)
// next2 = 2024-01-22 09:00:00 UTC (Monday)
```

## Notas

Usa semantica AND para day_of_month y day_of_week: ambos campos deben coincidir. El limite de 366 dias evita loops infinitos en schedules imposibles (ej: 29 de febrero en un ano sin bisiesto). Devuelve zero time en lugar de error para mantener purity: false/zero es el idiom de Go para retornos opcionales sin error.
