我想在我的文档中包含一个所谓的 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
这适用于pdflatex
和lualatex
,--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
的其他选项lua
os.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)是这里。