Time Calculation in LaTex

82 views
Skip to first unread message

Chitarup

unread,
Feb 3, 2008, 2:55:12 PM2/3/08
to
Hi,

is there a possibility to calculate time in LaTex. Let's say I define
a start time, add some minutes to it and use the current value in the
document. Something like:

\def\startTime{9:00}
\add\startTime{0:30}
\startTime % output 9:30

A solution of this would be very helpful.

Thanks,
Chitarup

Nicola Talbot

unread,
Feb 3, 2008, 3:29:21 PM2/3/08
to
On Feb 3, 7:55 pm, Chitarup <chita...@googlemail.com> wrote:
> is there a possibility to calculate time in LaTex. Let's say I define
> a start time, add some minutes to it and use the current value in the
> document.

Hi,

It's possible there's a neater way of doing this using the calc
package, but try the following

\documentclass{article}

\begin{document}

\newcount\hours
\newcount\minutes

\def\gettime#1:#2\relax#3#4{\def#3{#1}\def#4{#2}}

\newcommand{\add}[2]{\expandafter\gettime#1\relax{\hrs}{\mins}
\expandafter\gettime#2\relax{\addhrs}{\addmins}%
\hours=\hrs\relax
\advance\hours by \addhrs\relax
\minutes=\mins\relax
\advance\minutes by \addmins\relax
\ifnum\minutes>60\relax
\advance\minutes by -60\relax
\advance\hours by 1\relax
\else
\ifnum\minutes<0\relax
\advance\minutes by 60\relax
\advance\hours by -1\relax
\fi
\fi
\ifnum\hours>24\relax
\advance\hours by -24\relax
\else
\ifnum\hours<0\relax
\advance\hours by 24\relax
\fi
\fi
\ifnum\minutes<10\relax
\edef#1{\number\hours:0\number\minutes}%
\else
\edef#1{\number\hours:\number\minutes}%
\fi}

\def\startTime{9:00}
\add\startTime{0:30}
\startTime

\end{document}

Regards
Nicola Talbot

Chitarup

unread,
Feb 4, 2008, 4:14:26 AM2/4/08
to
Hello Nicola,

far out!!!! This is exactly what need.
Thank you very much.

Best whishes,
Chitarup

Nicola Talbot

unread,
Feb 4, 2008, 4:18:43 AM2/4/08
to
On Feb 3, 8:29 pm, Nicola Talbot <n...@cmp.uea.ac.uk> wrote:
> \ifnum\minutes>60\relax

Sorry, that should have been
\ifnum\minutes>59\relax

> \ifnum\hours>24\relax
Likewise, that should be
\ifnum\hours>23\relax

Regards
Nicola Talbot


Michele Dondi

unread,
Feb 4, 2008, 12:43:26 PM2/4/08
to

Perhaps not exactly what you expected, but especially if you also need
to work with dates, then you may go with PerlTeX and one out of a
zillion date calculating modules, like DateTime, or Date::Calc.


Michele
--
>It's because the universe was programmed in C++.
No, no, it was programmed in Forth. See Genesis 1:12:
"And the earth brought Forth ..."
- Robert Israel in sci.math, thread "Why numbers?"

Chitarup

unread,
Feb 4, 2008, 5:09:19 PM2/4/08
to
Hello Nicola,

thanks for the correction. Unfortunately the code doesn't work within
a table:

\def\startTime{9:45}
\begin{tabular}{|p{1cm}|p{4cm}|}
\hline
Time &
Content\\
\hline
\hline
\add\startTime{0:05} \textbf{\startTime} & \quad \\
\hline
\add\startTime{0:05} \textbf{\startTime} & \quad \\
\hline
\add\startTime{0:05} \textbf{\startTime} & \quad \\
\hline
\end{tabular}

The output is always 9:50. Outside of an table it works fine. Any
ideas?

Regards,
Chitarup

Nicola Talbot

unread,
Feb 4, 2008, 5:58:13 PM2/4/08
to
On Feb 4, 10:09 pm, Chitarup <chita...@googlemail.com> wrote:
> thanks for the correction. Unfortunately the code doesn't work within
> a table:

try changing \edef to \xdef

Regards
Nicola Talbot

Chitarup

unread,
Feb 4, 2008, 8:59:03 PM2/4/08
to
> try changing \edef to \xdef

Hello Nicola,

yes, this is working.

Thanks,
Chitarup

Olaf Meltzer

unread,
Feb 5, 2008, 5:39:38 AM2/5/08
to
* Nicola Talbot schrieb:

> On Feb 4, 10:09 pm, Chitarup <chita...@googlemail.com> wrote:
>> thanks for the correction. Unfortunately the code doesn't work
>> within a table:
>
> try changing \edef to \xdef

Nicola,

I think one has to \xdef\startTime[] inside the tabular as outside.
Have a look on this example, which is correct:

\documentclass{article}
\newcount\hours
\newcount\minutes

\def\gettime#1:#2\relax#3#4{\def#3{#1}\def#4{#2}}

\newcommand{\add}[2]{\expandafter\gettime#1\relax{\hrs}{\mins}
\expandafter\gettime#2\relax{\addhrs}{\addmins}%
\hours=\hrs\relax
\advance\hours by \addhrs\relax
\minutes=\mins\relax
\advance\minutes by \addmins\relax

\ifnum\minutes>59\relax


\advance\minutes by -60\relax
\advance\hours by 1\relax
\else
\ifnum\minutes<0\relax
\advance\minutes by 60\relax
\advance\hours by -1\relax
\fi
\fi

\ifnum\hours>23\relax


\advance\hours by -24\relax
\else
\ifnum\hours<0\relax
\advance\hours by 24\relax
\fi
\fi
\ifnum\minutes<10\relax

\xdef#1{\number\hours:0\number\minutes}%
\else
\xdef#1{\number\hours:\number\minutes}%
\fi}

\begin{document}

Start 22:08\def\startTime{22:08},
duration 5:53\add\startTime{05:53},
ETA (should be 4:01) calculated \startTime

\begin{table}
\centering
\begin{tabular}{rrrr}
Start 23:01 \xdef\startTime{23:01}
&duration 01:01 \add\startTime{01:01}
&ETA should be 0:02
&calculated \startTime\\
Start 02:55 \xdef\startTime{02:55}
&duration 23:05 \add\startTime{23:05}
&ETA should be 2:00
&calculated \startTime\\
\end{tabular}
\caption{Timetable}
\end{table}

\end{document}

Sincerely -- Olaf Meltzer

Olaf Meltzer

unread,
Feb 5, 2008, 5:50:44 AM2/5/08
to
* Nicola Talbot schrieb:

> On Feb 4, 10:09 pm, Chitarup <chita...@googlemail.com> wrote:
>> thanks for the correction. Unfortunately the code doesn't work
>> within a table:
>
> try changing \edef to \xdef

Nicola,

I think one has to \xdef\startTime{} even inside the tabular.


Have a look on this example, which is correct:

\documentclass{article}
\newcount\hours
\newcount\minutes

\def\gettime#1:#2\relax#3#4{\def#3{#1}\def#4{#2}}

\newcommand{\add}[2]{\expandafter\gettime#1\relax{\hrs}{\mins}
\expandafter\gettime#2\relax{\addhrs}{\addmins}%
\hours=\hrs\relax
\advance\hours by \addhrs\relax
\minutes=\mins\relax
\advance\minutes by \addmins\relax

\ifnum\minutes>59\relax


\advance\minutes by -60\relax
\advance\hours by 1\relax
\else
\ifnum\minutes<0\relax
\advance\minutes by 60\relax
\advance\hours by -1\relax
\fi
\fi

\ifnum\hours>23\relax


\advance\hours by -24\relax
\else
\ifnum\hours<0\relax
\advance\hours by 24\relax
\fi
\fi
\ifnum\minutes<10\relax

\xdef#1{\number\hours:0\number\minutes}%
\else
\xdef#1{\number\hours:\number\minutes}%
\fi}

\begin{document}

Olaf Meltzer

unread,
Feb 5, 2008, 7:40:13 AM2/5/08
to
* Olaf Meltzer schrieb:

> Nicola,
>
> I think one has to \xdef\startTime{} even inside the tabular.
> Have a look on this example, which is correct:

Another very small correction: First line of \newcommand{\add}...
should end with % to prevent a superfluous space wich otherwise would
prevent correct alignment.

As a result of further discussion in d.c.t.t one supposed to have a
solution to subtract times as well, and I modified your proposal in
accordance. Have a look on the combined add/subtract example.


%% LaTeX-Example: To add and subtract times
%%
%% Based on Nicola Talbots solution
%% of Chitarups problem from 2008-02-04 in ctt
%%


\documentclass{article}
\newcount\hours
\newcount\minutes

\def\gettime#1:#2\relax#3#4{\def#3{#1}\def#4{#2}}

\newcommand{\add}[2]{\expandafter\gettime#1\relax{\hrs}{\mins}%

\newcommand{\sub}[2]{\expandafter\gettime#1\relax{\hrs}{\mins}%
\expandafter\gettime#2\relax{\subhrs}{\submins}%
\hours=\hrs\relax
\advance\hours by -\subhrs\relax
\minutes=\mins\relax
\advance\minutes by -\submins\relax


\ifnum\minutes>59\relax
\advance\minutes by -60\relax
\advance\hours by 1\relax
\else
\ifnum\minutes<0\relax
\advance\minutes by 60\relax
\advance\hours by -1\relax
\fi
\fi
\ifnum\hours>23\relax
\advance\hours by -24\relax
\else
\ifnum\hours<0\relax
\advance\hours by 24\relax
\fi
\fi
\ifnum\minutes<10\relax
\xdef#1{\number\hours:0\number\minutes}%
\else
\xdef#1{\number\hours:\number\minutes}%
\fi}


\begin{document}

\section{Calculation of estimated time of arrival (ETA)}

The estimated time of arrival (ETA) is calculated as estimated
time of takeoff (ETT) plus duration.

ETT 22:08\def\startTime{22:08},


duration 5:53\add\startTime{05:53},

ETA (should be 4:01) calculated \startTime.


\section{Calculation of duration}

The duration is calculated as differenz between actual time of
arrival (ATA) and actual time of takoff (ATT).

ATT 20:05, ATA 0:15\def\startTime{00:15}, duration (should be
4:10)\sub\startTime{20:05}, calculated \startTime.


\begin{table}
\centering
\begin{tabular}{rrrr}

ETT&duration&correct&calculated\\


23:01\xdef\startTime{23:01}

&1:01\add\startTime{1:01}
&0:02
&\startTime\\
2:55\xdef\startTime{2:55}
&23:05\add\startTime{23:05}
&2:00
&\startTime\\
\end{tabular}
\caption{Calculated ETA (added times)}
\end{table}

\begin{table}
\centering
\begin{tabular}{rrrr}

ATA&ATT&correct&calculated\\
21:15\xdef\startTime{21:15}
&20:05\sub\startTime{20:05}
&1:10
&\startTime\\
0:15\xdef\startTime{0:15}
&20:05\sub\startTime{20:05}
&4:10
&\startTime\\
\end{tabular}
\caption{Calculated duration (subtracted times)}

Reply all
Reply to author
Forward
0 new messages