如何比较日期时间包中的两个时间

如何比较日期时间包中的两个时间

我有这个代码

\documentclass{article}
\usepackage{datetime}
\begin{document}
\currenttime
\par
\formattime{18}{0}{0} 
\end{document}

并想要比较这些时间是在 18 点之前还是之后。

答案1

datetime可以打印时间;如果您想要一个可扩展的时间测试,这里有一个可能性:

\documentclass{article}
\usepackage{datetime}
\usepackage{pdftexcmds}

\makeatletter

\newif\iftim@seconds
\@ifpackageloaded{datetime}
  {\@ifundefined{pdfcreationdate}\tim@secondsfalse\tim@secondstrue}
  {\ifdefined\pdfcreationdate\tim@secondstrue\fi}

\newcommand{\comparetime}[6]{%
  % #1=hour, #2=minutes, #3=seconds
  % #4=code if time is before current time
  % #5=code if time is equal to current time
  % #6=code if time is after current time
  \ifcase\pdf@strcmp{\tim@giventime{#1}{#2}{#3}}{\tim@currenttime}
    #5% case 0
  \or
    #6% case 1
  \else
    #4% case -1
  \fi
}

\iftim@seconds
  \def\tim@currenttime{%
    \expandafter\tim@currenttime@aux\pdfcreationdate\@nil
  }
  \expandafter\def\expandafter\tim@currenttime@aux\string D:#1#2#3#4#5#6#7#8#9\@nil{%
    \tim@currenttime@auxi#9\@nil
  }
  \def\tim@currenttime@auxi#1#2#3#4#5#6#7\@nil{%
    \number\numexpr #1#2*3600+#3#4*60+#5#6\relax
  }
  \def\tim@giventime#1#2#3{\number\numexpr#1*3600+#2*60+#3\relax}
\else
  \def\tim@currenttime{\number\time}
  \def\tim@giventime#1#2#3{\number\numexpr#1*60+#2\relax}
\fi

\begin{document}

\currenttime

\comparetime{15}{14}{0}{before}{equal}{after}

\comparetime{15}{40}{0}{before}{equal}{after}

\end{document}

该代码独立于datetime所有引擎并适用于所有引擎;但是,对于 XeLaTeX,秒数不可用,因此仅秒数部分不同的时间被视为相等。

该示例是在显示的时间编译的(这是加载的唯一原因datetime)。

在此处输入图片描述

答案2

秒数无关紧要,因为 TeX 执行时只知道午夜后的分钟数,不知道秒数。此信息存储在\time原始寄存器中。我创建了\giventime与上述类似的宏\formattime,但第三个参数(秒数)被忽略了。

\newcount\minutes
\def\giventime#1#2#3{\minutes=#1 \multiply\minutes by60 \advance\minutes by#2 }

\giventime{18}{59}{0}

\ifnum\time<\minutes Current time is before given \fi
\ifnum\time=\minutes Current time is in the same minute as given \fi
\ifnum\time>\minutes Current time is after given \fi

@请注意,我的宏中没有:-)

编辑我的解决方案表明,如果我们知道需要什么,并且知道 TeX 基元,那么解决方案可能比使用 LaTeX 包更简单、更直接。使用datetime,您必须比较两个字符串,并且解决方案包括复杂的宏,如在接受的答案中。使用 TeX 基元,您只需比较两个数字。

相关内容