在 for 循环/foreach 循环中将天数添加到 datetime2 中的特定日期

在 for 循环/foreach 循环中将天数添加到 datetime2 中的特定日期

我想计算一周的开始和结束日期(第一天是星期一,最后一天是星期日)。对于单个日期,这很好用。现在我想在循环中连续计算多个星期的开始和结束日期,给定开始日期(始终是星期一)和要计算的周数。这仅适用于第一次计算,这意味着下一个星期日的日期是正确的,但此后每次循环后日期都会重置。

生成的文件

我计算下一个日期的算法如下:

# 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

最小工作示例:

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

答案1

恐怕你已经陷入了宏的典型陷阱pgffor\foreach它评估循环体TeX 组内,因此其中执行的局部赋值在每次迭代结束时都会丢失。我的建议是使用 的expl3\int_step_inline:nnn或它的姊妹宏之一。另一个选择是在循环结束时对计数寄存器执行全局赋值;但是,一般应避免将局部赋值和全局赋值混合到同一个宏或寄存器(参见 TeXbook 第 27 章关于“保存堆栈构建”的内容)。以下是使用 的宏的\datecount解决方案:expl3\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}

在此处输入图片描述

相关内容