假设现在是 2019-07-21-082935。
如果我使用 datetime2 包,我该使用哪些命令分别检索“2019”、“19”、“07”、“7”、“JUL”、“July”、“21”、“SUN”、“Sun”、“Sunday”、“082935”、“0829”、“08”、“29”、“35”?
(我原以为会有一些简单的命令如 \yyyy、\mm、\MMM、\Mm 等,但似乎没有。)
如果上述方法不可行,还有其他我可以使用的包吗?
答案1
datetime2
似乎没有提供命令来解析日期/时间格式字符串并输出特定组件。如果您只想访问单个组件,您可以轻松定义一个宏,将参数与给定格式进行比较并输出相应格式的相应组件。
下面的代码定义了一个宏\formatdatetime{<saved date name>}{<component format>}
,它根据传递的格式格式化保存日期的特定部分。由于您还不清楚应该将哪个字符串映射到哪种格式,因此这段代码应该更多地被视为想法的草图,而不是完整的实现。
\documentclass{article}
\usepackage[english]{babel}
\usepackage[calc]{datetime2}
\newcommand\formatdatetime[2]{%
\begingroup
\renewcommand*\DTMdisplaydate[4]{}%
\renewcommand*\DTMdisplaytime[3]{}%
\renewcommand*\DTMdisplayzone[2]{}%
%
\ifmatches{#2}{yyyy}{\renewcommand*\DTMdisplaydate[4]{\number##1}}%
\ifmatches{#2}{yy} {\renewcommand*\DTMdisplaydate[4]{\DTMtwodigits{##1}}}%
\ifmatches{#2}{m} {\renewcommand*\DTMdisplaydate[4]{##2}}%
\ifmatches{#2}{mm} {\renewcommand*\DTMdisplaydate[4]{\DTMtwodigits{##2}}}%
\ifmatches{#2}{mmm} {\renewcommand*\DTMdisplaydate[4]{\DTMshortmonthname{##2}}}%
\ifmatches{#2}{mmmm}{\renewcommand*\DTMdisplaydate[4]{\DTMmonthname{##2}}}%
\ifmatches{#2}{d} {\renewcommand*\DTMdisplaydate[4]{##3}}%
\ifmatches{#2}{dd} {\renewcommand*\DTMdisplaydate[4]{\DTMtwodigits{##3}}}%
\ifmatches{#2}{ddd} {\renewcommand*\DTMdisplaydate[4]{\DTMshortweekdayname{##4}}}%
\ifmatches{#2}{dddd}{\renewcommand*\DTMdisplaydate[4]{\DTMweekdayname{##4}}}%
%
\DTMuse{#1}%
\endgroup
}
\newcommand\ifmatches[3]{%
\def\tempa{#1}%
\def\tempb{#2}%
\ifx\tempa\tempb #3\fi
}
\newcommand\testdatetime[2]{%
\makebox[4em][l]{#2}: \formatdatetime{#1}{#2}\par
}
\begin{document}
\DTMsavenow{mydate}
\makebox[4em][l]{now}: \DTMuse{mydate}\par
\testdatetime{mydate}{yyyy}
\testdatetime{mydate}{yy}
\testdatetime{mydate}{m}
\testdatetime{mydate}{mm}
\testdatetime{mydate}{mmm}
\testdatetime{mydate}{mmmm}
\testdatetime{mydate}{d}
\testdatetime{mydate}{dd}
\testdatetime{mydate}{ddd}
\testdatetime{mydate}{dddd}
\end{document}
输出