使用 `datetime` 将当前时间输出到文件

使用 `datetime` 将当前时间输出到文件

如何使用datetime包将当前时间打印到文件中。运行时,pdflatex我正在生成一个文件foo.def,我想在文件的顶部添加一条注释,格式为当前日期时间YYYY-MM-DD hh:mm:ss

datetime2如果使用该包(即该行\def\UseOldDatetimePackage{}%被注释),则以下 MWE 可以按预期工作并产生结果:

在此处输入图片描述

在 pdf、.log 文件和foo.def文件中。

但是,如果按原样运行,即使用该datetime包,pdf 会显示正确的结果,但 .log 文件会显示

当前时间 = \currenttime

以及foo.def演出:

% \protect @day =\day \relax @month =\month \relax @year =\year \relax 2023/05/18 \protect \protect \c@HOUR =\currenthour \c@HOURXII =\c@HOUR \c@MINUTE =\currentminute \c@TOHOUR =\c@HOURXII \advance \c@TOHOUR 加 1\relax @DT@modctr =\c@TOHOUR \relax \divide @DT@modctr 加 12\relax \multiply @DT@modctr 加 12\relax \advance \c@TOHOUR 加 -@DT@modctr \c@TOMINUTE =\c@MINUTE \advance \c@TOMINUTE 加 -60\relax \multiply \c@TOMINUTE 加 -1\relax \c@SECOND =\当前秒 \放松 01:06:29\放松

那么,正确的解决方案是什么datetime

笔记:

  • 最终将迁移到datetime2,但目前遇到一些问题,我需要更多时间来研究。
  • MWE 需要-shell-escape运行选项。

代码:

\documentclass{article}

\let\OldToday\today

\def\UseOldDatetimePackage{}% <-- Works if this is commented
\ifdefined\UseOldDatetimePackage
    \usepackage[yyyymmdd,hhmmss]{datetime}
    \def\CurrentTime{\currenttime}%
\else
    \usepackage[]{datetime2}
    \def\CurrentTime{\DTMcurrenttime}
\fi


\def\TitleHeader{\today\space \CurrentTime}

\makeatletter
\newcommand{\WriteFooTexFile}{%
    \immediate\write18{printf "\\n" > foo.def }% Initialize File
    \immediate\write18{%
        printf "\@percentchar s\string\\n"
            "\@percentchar\space\TitleHeader" >>
            foo.def }%
}%
\makeatother

\begin{document}
    \TitleHeader
    
    \typeout{current time = \CurrentTime}
    \WriteFooTexFile
\end{document}

答案1

以下使用datetime存储当前时间的计数器,但以可扩展的方式对输出格式进行硬编码:

\documentclass{article}

\let\OldToday\today

\def\UseOldDatetimePackage{}% <-- Works if this is commented
\ifdefined\UseOldDatetimePackage
    \usepackage[yyyymmdd,hhmmss]{datetime}
    \def\Today
      {\the\year\dateseparator\twodigit\month\dateseparator\twodigit\day}
    \def\CurrentTime
      {%
        \twodigit\currenthour\timeseparator
        \twodigit\currentminute\timeseparator
        \twodigit\currentsecond
      }
\else
    \usepackage[]{datetime2}
    \def\Today{\today}
    \def\CurrentTime{\DTMcurrenttime}
\fi


\def\TitleHeader{\Today\space \CurrentTime}

\makeatletter
\newcommand{\WriteFooTexFile}{%
    \immediate\write18{printf "\\n" > foo.def }% Initialize File
    \immediate\write18{%
        printf "\@percentchar s\string\\n"
            "\@percentchar\space\TitleHeader" >>
            foo.def }%
}%
\makeatother

\begin{document}
    \TitleHeader
    
    \typeout{current time = \CurrentTime}
    \WriteFooTexFile
\end{document}

答案2

这里有一个解决方案,不需要 shell-escape 即可使用 PDFLaTeX 或 LuaLaTeX 将当前日期和时间写入文件:

\documentclass{article}
\usepackage{listings}
\usepackage{iftex}
\makeatletter
\newwrite\foodef
\begingroup
  \def\@splitcreationdate #1:#2#3#4#5#6#7#8#9{%
    #2#3#4#5-#6#7-#8#9\@splithourminute
  }%
  \def\@splithourminute#1#2#3#4#5#6{ #1#2:#3#4:#5#6\@splitoffset}%
  \def\@splitoffset #1'#2'{#1:#2}%
  \immediate\openout\foodef \jobname.def
  \ifpdftex
    \immediate\write\foodef{\@percentchar\space
      \expandafter\@splitcreationdate\pdfcreationdate}
  \else
    \ifluatex
      \immediate\write\foodef{\@percentchar\space
        \expandafter\@splitcreationdate\pdffeedback creationdate }
    \fi
  \fi
  \immediate\closeout\foodef
\endgroup
\makeatother

\begin{document}
\lstinputlisting{\jobname.def}
\end{document}

写道,例如:

% 2023-05-18 11:29:06+02:00

到文件foo.def(然后读取foo.def,以便在 PDF 中显示该内容)。

抱歉,但我不知道如何使用 XeLaTeX 获得第二个。

相关内容