两个给定日期间相差天数是一个非常简单的数学问题。在使用LaTeX写文档时,如果需要计算两个日期之间相差天数,可以自定义一个宏命令计算出来。datetime2是一个与日期时间相关的功能很强大的宏包,可以自定义各种各样的日期格式。如果以带选项 calc 的方式加载该宏包或在加载该宏包后再加载 datetime2-calc 宏包,则宏包提供了一些日期间的计算功能。这里给出一个例子:
\documentclass{ctexart}
\usepackage[calc]{datetime2}
\newcount\mydaydiff
\DTMnewdatestyle{cyyyymd}{%
\renewcommand*{\DTMdisplaydate}[4]{%
{##1}~年~{##2}~月~{##3}~日}
\renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
}
\newcommand\DayDiff[2]{%
\DTMsavedate{sdate}{#2}
\DTMsavedate{edate}{#1}
\DTMsaveddatediff{edate}{sdate}{\mydaydiff}
\DTMusedate{edate}与\DTMusedate{sdate}相差\the\mydaydiff 天。
}
\begin{document}
\DTMsetdatestyle{cyyyymd}
\DayDiff{2009-8-8}{2008-8-8}
\end{document}
不过很遗憾的是,这时自定义的日期格式会发生一些变化,比如,原本定义以一或两位数字表示月、日的格式,月、日都会被强制以两位数字表示。这个问题在网站的问答交流区也有提出,地址在:https://wenda.latexstudio.net/q-1082.html。如何能计算并显示两个日期之间的相差天数而又不影响自定义日期格式呢?笔者查看了datetime2-calc 的相关代码,发现datetime2-calc 实际是通过 pgfcalendar 宏包来实现日期计算功能的,因此,我们可以通过 pgfcalendar 宏包直接编写这个自定义的宏命令,举例如下:
\documentclass{ctexart}
\usepackage{datetime2,pgfcalendar}
\newcount\sdate
\newcount\mydaydiff
\DTMnewdatestyle{cyyyymd}{%
\renewcommand*{\DTMdisplaydate}[4]{%
{##1}年{##2}月{##3}~日}
\renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
}
\newcommand\DayDiff[2]{%
\DTMsavedate{sdate}{#2}
\DTMsavedate{edate}{#1}
\pgfcalendardatetojulian{#1}{\mydaydiff}
\pgfcalendardatetojulian{#2}{\sdate}
\advance\mydaydiff by -\sdate\relax
\DTMusedate{edate}与\DTMusedate{sdate}相差\the\mydaydiff 天。
}
\begin{document}
\DTMsetdatestyle{cyyyymd}
\DayDiff{2009-8-8}{2008-8-8}
\end{document}
另:举例中使用的中文日期格式其实可以通过 zhnumber 宏包来实现,zhdate{<yyyy/mm/dd>} 即可以中文格式输出日期,不过,这个宏命令中的日期格式是yyyy/mm/dd,和 pgfcalendar、datetime2 等宏包使用的yyyy-mm-dd 的格式是不一样的,参数解析和传递就麻烦得多了,所以这里使用 datetime2 自定义中文日期格式。