我有这个代码
\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 基元,您只需比较两个数字。