Agregue días a una fecha específica en datetime2 en un bucle for/foreach

Agregue días a una fecha específica en datetime2 en un bucle for/foreach

Quiero calcular la fecha de inicio y finalización de una semana (el primer día es el lunes y el último es el domingo). Esto funciona bien para una sola cita. Ahora quiero calcular el inicio y el final de varias semanas consecutivas en un bucle, dada la fecha de inicio (siempre un lunes) y la cantidad de semanas a calcular. Esto funciona sólo para el primer cálculo, lo que significa que la fecha del próximo domingo es correcta, pero después de eso la fecha siempre se restablece después de cada ciclo.

Documento resultante

Mi algoritmo para calcular la próxima fecha se ve así:

# cursor is at a Monday
for n in 1 .. 10:
    print(cursor) # Monday
    add 6 days to cursor
    print(cursor) # Sunday
    add 1 day to cursor
end for

Ejemplo de trabajo mínimo:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[calc]{datetime2}
\usepackage{pgffor}
\setlength{\parindent}{0pt}

\begin{document}

\newcommand{\nweeks}{4}
\newcommand{\startdate}{2020-09-07}

\newcount\datecount
\newcommand{\dateoffset}[2]{%
    \DTMsaveddateoffsettojulianday{#1}{#2}{\datecount}%
    \DTMsavejulianday{#1}{\datecount}%
}

\DTMsavedate{currentdate}{\startdate}

Start-Week-1: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{6}
End-Week-1: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{1}
Start-Week-2: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{6}
End-Week-2: \DTMusedate{currentdate}\\
\dateoffset{currentdate}{1}

\DTMsavedate{currentdate}{\startdate}

\foreach \n in {1,...,\nweeks}{
    Start-Week-\n: \DTMusedate{currentdate}\\
    \dateoffset{currentdate}{6}
    End-Week-\n: \DTMusedate{currentdate}\\
    \dateoffset{currentdate}{1}
}

\end{document}

Respuesta1

Me temo que has caído en la típica trampa de la macro pgffor's \foreach: evalúa el cuerpo del bucledentro de un grupo TeX, por lo tanto, las asignaciones locales realizadas allí se pierden al final de cada iteración. Mi sugerencia sería utilizar la macro expl3de 's \int_step_inline:nnno una de sus hermanas. Otra opción sería realizar una asignación global al \datecountregistro de conteo al final del ciclo; sin embargo, en general se debe evitar mezclar asignaciones locales y globales a la misma macro o registro (ver el capítulo 27 del TeXbook sobre “guardar acumulación de pila”). Aquí hay una solución usando la macro expl3de :\int_step_inline:nnn

\documentclass{article}
\usepackage{expl3}
\usepackage[calc]{datetime2}

\ExplSyntaxOn
% Borrow \int_step_inline:nnn from expl3
\cs_new_eq:NN \intstepinline \int_step_inline:nnn
\ExplSyntaxOff

\newcount\datecount
\newcommand*{\dateoffset}[2]{%
    \DTMsaveddateoffsettojulianday{#1}{#2}{\datecount}%
    \DTMsavejulianday{#1}{\datecount}%
}

\newcommand{\nweeks}{4}
\newcommand{\startdate}{2020-09-07}
\DTMsavedate{currentdate}{\startdate}

\setlength{\parindent}{0pt}

\begin{document}

\intstepinline{1}{\nweeks}{%
  Start-Week-#1: \DTMusedate{currentdate}%
  \dateoffset{currentdate}{6}\\
  End-Week-#1: \DTMusedate{currentdate}%
  \dateoffset{currentdate}{1}%
  \par
}

\end{document}

ingrese la descripción de la imagen aquí

información relacionada