如何从 iso 8601 格式的日期中提取年份?

如何从 iso 8601 格式的日期中提取年份?

我想提取数据库中以 ISO 8601 格式存储的日期的年份(或日期或月份)。

我的 MWE 如下所示:

\documentclass{article}
\usepackage{xstring}

\usepackage{datatool}


\newcommand{\myload}[3][1]{%
  \DTLgetvalue
  {\thevalue}
  {#2}
  {#1}
  {\dtlcolumnindex
    {#2}
    {#3}}%
}

%\get{<DATABASE>}{<FIELD>}
\newcommand{\get}[3][1]{%
  \myload[#1]{#2}{#3}
   \thevalue%
  }


% https://tex.stackexchange.com/a/42027/98739
\newcommand*{\dfgExtractYear}[1]{\StrBefore[1]{#1}{-}}%
\newcommand*{\dfgExtractMonth}[1]{\StrBetween[1,2]{#1}{-}{-}}%
\newcommand*{\dfgExtractDay}[1]{\StrBehind[2]{#1}{-}}%


% database

\DTLnewdb{name}
\DTLnewrow{name}
\DTLnewdbentry{name}{dateBirth}{1980-12-04}

\begin{document}

date: \get{name}{dateBirth}\\ % works
Year: \dfgExtractYear{YYYY-MM-DD}\\% works
Day: \dfgExtractDay{YYYY-MM-DD}\\% works
Month: \dfgExtractMonth{YYYY-MM-DD}\\% works


Only Year: \dfgExtractMonth{\get{name}{dateBirth}}% does not work

\end{document}

结果如下:

在此处输入图片描述

如何将日期部分的提取代码与数据库的条目结合起来?

答案1

解释可以参见例如https://tex.stackexchange.com/a/632508/250119或我的答案https://tex.stackexchange.com/a/646000/250119(情况 2.1.1),即您的定义\get不是完全可扩展的。

要解决这个特殊情况,你必须移到\myload外面:

\documentclass{article}
\usepackage{xstring}

\usepackage{datatool}


\newcommand{\myload}[3][1]{%
  \DTLgetvalue
  {\thevalue}
  {#2}
  {#1}
  {\dtlcolumnindex
    {#2}
    {#3}}%
}

%\get{<DATABASE>}{<FIELD>}
\newcommand{\get}[3][1]{%
  \myload[#1]{#2}{#3}
   \thevalue%
  }


% https://tex.stackexchange.com/a/42027/98739
\newcommand*{\dfgExtractYear}[1]{\StrBefore[1]{#1}{-}}%
\newcommand*{\dfgExtractMonth}[1]{\StrBetween[1,2]{#1}{-}{-}}%
\newcommand*{\dfgExtractDay}[1]{\StrBehind[2]{#1}{-}}%


% database

\DTLnewdb{name}
\DTLnewrow{name}
\DTLnewdbentry{name}{dateBirth}{1980-12-04}

\begin{document}

date: \get{name}{dateBirth}\\ % works
Year: \dfgExtractYear{YYYY-MM-DD}\\% works
Day: \dfgExtractDay{YYYY-MM-DD}\\% works
Month: \dfgExtractMonth{YYYY-MM-DD}\\% works


Only Year: \myload{name}{dateBirth}\dfgExtractMonth{\thevalue}
\end{document}

(只改了倒数第二行),比较不方便。

或者,为了方便起见,使用functional包来定义\get\dfgExtractMonth,这样你就可以\get在参数中使用\dfgExtractMonth使用,但目前它不支持可选参数(请参阅将 \input 与 siunitx 的 \num 结合使用 并且有一些解决方法)

相关内容