如何制作与时间相关的代码?

如何制作与时间相关的代码?

我想创建一个命令\ifafter{year}{month}{day}{yes}{no},以便如果当前日期在year//month之后day,该命令将生成yes,否则生成no

我想出了一个解决方案,我想记录下来并查看其他解决方案hour。自然的概括,例如将当前时间与::进行比较minute的版本、检查/ /是否比未来(或过去)几天更远的second版本等,也将受到欢迎。yearmonthdayx

答案1

无需任何包就可以获得相同的结果:

\makeatletter
\newcommand\ifafter[3]{%
  \ifnum\the\year\two@digits\month\two@digits\day >
     \numexpr#1\two@digits{#2}\two@digits{#3}\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

我们还可以将日期编码为“年*10000+月*100+日”,因此测试可以是

\makeatletter
\newcommand\ifafter[3]{%
  \ifnum\numexpr\year*10000+\month*100+\day\relax
       >\numexpr#1*10000+#2*100+#3\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

或者,有etoolboxdatetime没有辅助计数器:

\newcommand{\ifafter}[5]{%
  \ifnumgreater
    {\the\year\twodigit{\the\month}\twodigit{\the\day}}
    {#1\twodigit{#2}\twodigit{#3}}
    {#4}
    {#5}% 
}

这里相关的事情是,TeX 在寻找数字时会继续扩展标记。我的定义也允许

\ifafter{2012}{1}{16}{Yes, it is after Jan. 16, 2012.}{No, it is not after Jan. 16, 2012.}

您的宏将在 2012 年 1 月 17 日失败,原因是

\ifafter{2012}{2}{1}{after}{not after}

因为比较的是 20120117 和 201221。使用\twodigit今天的日期和用户输入可以保证正确的结果,即使用户很懒。

LaTeX3 版本:

\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\ifafter}{ m m m }
  {
   \int_compare:nTF
     { \year*10000+\month*100+\day > #1*10000+#2*100+#3 }
  }
\ExplSyntaxOff

答案2

您可以使用日期寄存器\year\month\day它们将当前年、月、日保存为整数。如果您将\the它们放在前面,它们将扩展为数字,如果您想连接这些数字,这一点很重要。

您可以使用原语来比较两个整数。但是,如果月份或日期小于 10,则\ifnum需要添加:0

\documentclass{article}
\makeatletter
\newcommand{\ifafter}[3]{%
    \ifnum#1#2#3<\the\year\ifnum\month<10 0\fi\the\month\ifnum\day<10 0\fi\the\day\space
        \expandafter\@firstoftwo
    \else
        \expandafter\@secondoftwo
    \fi
}
\makeatother
\begin{document}
\ifafter{2012}{01}{16}{After 16th Jan 2012.}{Before 16th Jan 2012.}

\ifafter{2012}{01}{17}{After 17th Jan 2012.}{Before 17th Jan 2012.}

\ifafter{2012}{01}{18}{After 18th Jan 2012.}{Before 18th Jan 2012.}
\end{document}

这不需要任何包或 e-TeX。

对于更复杂的事情,我推荐datenumber可以计算两个日期之间天数差的包。请参阅\daydifftoday包手册背面的示例。

答案3

以下是我想到的解决方案。今天(2012 年 1 月 17 日)编译以下代码,

\documentclass{article}  
\usepackage{etoolbox,datetime}  
\newcommand{\twodigitday}{\twodigit{\the\day}}
\newcommand{\twodigitmonth}{\twodigit{\the\month}}
\newcounter{mydatenum}
\setcounter{mydatenum}{\the\year\twodigitmonth\twodigitday}
\newcommand{\ifafter}[5]{\ifnumgreater{\arabic{mydatenum}}{#1#2#3}{#4}{#5}}
\begin{document}
\ifafter{2012}{01}{16}{Yes, it is after Jan. 16, 2012.}{No, it is not after Jan. 16, 2012.}
\ifafter{2012}{01}{17}{Yes, it is after Jan. 17, 2012.}{No, it is not after Jan. 17, 2012.}
\end{document}

生产

在此处输入图片描述

相关内容