Adicione dias a uma data específica em datetime2 em um loop for/loop foreach

Adicione dias a uma data específica em datetime2 em um loop for/loop foreach

Quero calcular a data de início e término de uma semana (o primeiro dia é segunda-feira, o último é domingo). Isso está funcionando bem para uma única data. Agora quero calcular o início e o fim de várias semanas consecutivas em um loop, dada a data de início (sempre uma segunda-feira) e o número de semanas a serem calculadas. Isto funciona apenas para o primeiro cálculo, o que significa que a data do próximo domingo está correta, mas depois disso a data é sempre zerada após cada loop.

Documento resultante

Meu algoritmo para calcular a próxima data é assim:

# 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

Exemplo mínimo de trabalho:

\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}

Responder1

Receio que você tenha caído na armadilha típica da macro pgfforde \foreach: ela avalia o corpo do loopdentro de um grupo TeX, portanto, as atribuições locais realizadas nele são perdidas no final de cada iteração. Minha sugestão seria usar a macro expl3do \int_step_inline:nnnou uma de suas irmãs. Outra opção seria realizar uma atribuição global ao \datecountregistrador de contagem no final do loop; entretanto, misturar atribuições locais e globais à mesma macro ou registro deve ser evitado em geral (cf. capítulo 27 do TeXbook sobre “save stack build”). Aqui está uma solução usando a 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}

insira a descrição da imagem aqui

informação relacionada