文档中的 UNIX 时间戳(= 自 1970 年 1 月 1 日以来的秒数)?

文档中的 UNIX 时间戳(= 自 1970 年 1 月 1 日以来的秒数)?

我想在我的文档中包含一个所谓的 UNIX 时间戳。抛开所有技术细节不谈,它基本上是自 1970 年 1 月 1 日 0:00 UTC 以来的秒数,也称为“纪元”。(在我写这篇文章的时候,它是 1385812869。)

我还没有找到在文档中包含该数字的方法。除非我忽略了某些东西,否则明显的嫌疑对象(datetime、isodate、scrtime)似乎没有提供现成的解决方案。

答案1

在此处输入图片描述

pdflatex \\def\\epoch{`date +%s`}\\input ep.tex

命令行上引用的具体形式取决于你的 shell(这是 bash)

哪里ep.tex

\documentclass{article}

\begin{document}

now = \epoch.


\end{document}

如果您想在经典 TeX 中方便地计算它(实际上我使用了 etex,算术,但可以轻松删除),您可以这样做(这在我的系统中实际上正好是 1 天,因此您可以修复我的算术或者只是在开始时添加一天 :-)

在此处输入图片描述

\documentclass{article}

\begin{document}

now1 = \epoch.
\newcount\tepoch

\count0=\numexpr\year-1970\relax
\tepoch=\numexpr\count0*365*24*60*60\relax

\count2=\count0
\divide\count2 4

%extra day for each leap year (avoid complication of mod 100 and mod 400, so we are good until 2100
\advance\tepoch\numexpr\count2*24*60*60\relax

% extra whatever for each whole month
\ifnum\month>1 \advance\tepoch\numexpr 31*24*60*60\relax \fi

\ifnum\numexpr4*\count2\relax=\count0
  \ifnum\month>2 \advance\tepoch\numexpr 29*24*60*60\relax \fi
\else
  \ifnum\month>2 \advance\tepoch\numexpr 28*24*60*60\relax \fi
\fi

\ifnum\month>3 \advance\tepoch\numexpr 31*24*60*60\relax \fi
\ifnum\month>4 \advance\tepoch\numexpr 30*24*60*60\relax \fi
\ifnum\month>5 \advance\tepoch\numexpr 31*24*60*60\relax \fi
\ifnum\month>6 \advance\tepoch\numexpr 30*24*60*60\relax \fi
\ifnum\month>7 \advance\tepoch\numexpr 31*24*60*60\relax \fi
\ifnum\month>8 \advance\tepoch\numexpr 31*24*60*60\relax \fi
\ifnum\month>9 \advance\tepoch\numexpr 30*24*60*60\relax \fi
\ifnum\month>10 \advance\tepoch\numexpr 31*24*60*60\relax \fi
\ifnum\month>11 \advance\tepoch\numexpr 30*24*60*60\relax \fi

% seconds from previous days in this month
\advance\tepoch\numexpr (\day-1)*24*60*60\relax

% seconds from today
\advance\tepoch\numexpr \time*60\relax


now2 = \the\tepoch.

diff = \the\numexpr(\epoch-\tepoch)/(60*60)\relax\ hours

\end{document}

答案2

这适用于pdflatexlualatex--shell-escape;当然它依赖于系统并且只能在 Unix 系统上工作。

\documentclass{article}
\usepackage{catchfile}
\makeatletter
\CatchFileEdef{\epoch}{|"date -j +\@percentchar s"}{\endlinechar=\m@ne}
\CatchFileEdef{\timestamp}{|"date -j"}{\endlinechar=\m@ne}
\makeatother
\begin{document}
\epoch

\timestamp

\pdfcreationdate % this is available also without shell escape
\end{document}

在此处输入图片描述

答案3

除了有趣回答大卫和他的建议关于手动计算,这是我基于的解决方案luatex。请注意,这只是一个指导方针,代码既不干净也不完整。还有很多改进的空间!

\documentclass{article} 
\usepackage{luacode}
\begin{luacode*}
    function epoch (format,time)
    if format == 1 then
      fmt = "%c"
    elseif format == 2 then
      fmt = "%A"
    elseif format == 3 then
      fmt = "%B"
    elseif format == 4 then
      fmt = "%X"
    else
      fmt = "%x"
    end
    tex.sprint(os.date(fmt, time))
    end
\end{luacode*}

\newcommand\epoch[2]{\directlua{epoch(#1,#2)}}

\begin{document}
This is a test. We now check the time stamp for 1385817087
\begin{itemize}
    \item \%c \epoch{1}{1385817087}
    \item \%A \epoch{2}{1385817087}
    \item \%B \epoch{3}{1385817087}
    \item \%X \epoch{4}{1385817087}
\end{itemize}
\end{document}

您必须通过 编译它。可以找到使用函数lualatex myfile.tex的其他选项luaos.date这里


在此处输入图片描述


答案4

为了补充 David Carlisle 的答案中使用 POSIXdate实用程序的那部分,这里有一种在 Windows 上获取纪元的方法。

在 Windows 上,“纪元时间”概念不仅在类 Unix 环境及其实用程序中实现,而且在 Microsoft Visual C 库中实现的标准 C 库函数中也实现。

也就是说,微软的 <time.h>材料基于类 Unix,time_t其单位是秒,并且从纪元开始测量。ISO C 并不要求这样做,但它有助于移植采用该表示法的代码。

因此,您可以使用 Visual C 来精简一些epoch.exe打印时间的功能。

我刚刚用 VS2008 将此代码编译成 Win32 控制台应用程序。

#include <stdio.h>
#include <time.h>

int main(void)
{
   printf("%ld\n", (long) time(0));
   return 0;
}

静态链接(不依赖于msvcrt.dll)可执行文件(156 kB)是这里

相关内容