4

I want to know if there is a way to get the date elements (year, month, day, hour, minute, second) in order to create a lucky of version number that automatically increments. For example if now it is 15:30 hs of March 19 of the year 2018, I would like to generate a number like: 201803191530 where the format is YYYYMMDDHHmm. I would like to have the possibility to arrange the elements in any way. It would be ideal some sort of comands like \year \month \day \hour \minute \second, for example, so then I can use them as I wish.

  • 2
    Have you seen the datetime2 package? It allows you to access the date and time with customized formatting. – Marcel Krüger Mar 19 '18 at 18:59
10

An expandable time stamp definition without any package:

\documentclass{article}

\makeatletter
\edef\timestamp{%
  \the\year
  \two@digits\month
  \two@digits\day
  \two@digits{\numexpr(\time*2 - 59)/120\relax}%
  \two@digits{\numexpr\time - 60*\numexpr(\time*2 - 59)/120\relax\relax}%
}
\makeatother

\typeout{Time stamp: \timestamp}

\begin{document}
  Time stamp: \timestamp
\end{document}

Result

Remarks:

  • \time gets the minutes of the day.
  • e-TeX's \numexpr allows expandable calculations. However, it rounds. The complicate formulas work around it.
  • \two@digits comes from the LaTeX kernel and is intended for positive integers. If the number is less than 10, it adds a preceding zero.
3

If you use pdflatex, you can use \pdfcreationdate that records the time stamp when the PDF file is opened for output, which is a string of the form

D:20170421011556+02’00’

The last seven characters represent the difference with UTC. So it's just a matter of parsing the string. I added a possible definition for your time stamp, reorder the items at will.

\documentclass{article}

\makeatletter
\begingroup
\def\set@time@data#1:#2\@nil{\set@time@data@a#2}
\def\set@time@data@a#1#2#3#4{%
  \gdef\Year{#1#2#3#4}%
  \set@time@data@b
}
\def\set@time@data@b#1#2#3#4{%
  \gdef\Month{#1#2}%
  \gdef\Day{#3#4}%
  \set@time@data@c
}
\def\set@time@data@c#1#2#3#4#5#6{%
  \gdef\Hour{#1#2}%
  \gdef\Min{#3#4}%
  \gdef\Sec{#5#6}%
  \set@time@data@d
}
\def\set@time@data@d#1#2#3#4#5#6#7{}
% start up the business
\expandafter\set@time@data\pdfcreationdate\@nil
\endgroup
\edef\TimeStamp{\Year-\Month-\Day\space\Hour:\Min:\Sec}
\makeatother

\begin{document}

Time stamp: \TimeStamp

\medskip

\begin{tabular}{@{}ll}
Year & \Year \\
Month & \Month \\
Day & \Day \\
Hour & \Hour \\
Min & \Min \\
Sec & \Sec \\
\end{tabular}

\end{document}

enter image description here

Similar, but with clearer syntax (here I just define the \TimeStamp macro); just move around the various ranges.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\cs_set:Npx \TimeStamp
 {
  \str_range:Nnn \pdfcreationdate { 3 } { 6 } % year
  -
  \str_range:Nnn \pdfcreationdate { 7 } { 8 } % month
  -
  \str_range:Nnn \pdfcreationdate { 9 } { 10 } % day
  \space
  \str_range:Nnn \pdfcreationdate { 11 } { 12 } % hour
  :
  \str_range:Nnn \pdfcreationdate { 13 } { 14 } % minutes
  :
  \str_range:Nnn \pdfcreationdate { 15 } { 16 } % seconds
 }
\ExplSyntaxOff

\begin{document}

Time stamp: \TimeStamp

\end{document}

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.