Wie berechnet man die Differenz zwischen zwei Zeitpunkten (z. B. 11:30 Uhr und 13:20 Uhr => 110 Min.)?

Wie berechnet man die Differenz zwischen zwei Zeitpunkten (z. B. 11:30 Uhr und 13:20 Uhr => 110 Min.)?

Gibt es eine einfache Möglichkeit, die Differenz zwischen zwei Zeiten (am selben Tag) zu berechnen, sodass 11:30 Uhr und 13:20 Uhr beispielsweise zu 110 Minuten (oder 1 Stunde und 50 Minuten) führen sollten? Ich habe das datenumberPaket gesehen, aber es scheint nur Tagesdifferenzen zu berechnen (funktioniert also in größerem Maßstab). [Ich habe kein Minimalbeispiel beigefügt, da ich keine elegante Möglichkeit habe, das Problem zu beginnen, außer (hässlichen?) String-„Teile-und-herrsche“-Ansätzen]

Okay, ich habe gerade auch herausgefunden, datetimewas vielversprechender aussieht. Trotzdem sehe ich nicht, wie man mit diesem Paket Zeitpunktunterschiede berechnen kann (oder calc?)

Aktualisieren Nach Davids Antwort habe ich das MWE auf mein ursprüngliches Beispiel erweitert und dabei folgendes Runaway argumentProblem festgestellt:

\documentclass{article}

\newcommand*{\mystart}{11:30 am}
\newcommand*{\myend}{01:20 pm}

% duration
\def\duration#1#2{%
  \the\numexpr(\xduration#2\relax)-(\xduration#1\relax)\relax\ minutes}

\def\xduration#1:#2 #3m#4\relax{%
(#1)*60+#2\if p#3+720 \fi
}

% environment
\newenvironment{tbl}[3]{
  \begin{tabular}{ll}
    #1 & \duration{#2}{#3}\\
  \end{tabular}
}{}

\begin{document}
\begin{tbl}{Duration}{\mystart}{\myend}% Runaway argument? ! File ended while scanning use of \xduration.
%\begin{tbl}{Duration}{11:30 am}{01:20 pm}% works
\end{tbl}
\end{document}

Wie kann das vermieden werden? [ein weiteres Paar {}hat nicht geholfen]

Antwort1

\documentclass{article}

\def\foo#1#2{%
  \the\numexpr(\xfoo#2\relax)-(\xfoo#1\relax)\relax\ minutes}

\def\xfoo#1:#2 #3m#4\relax{%
%(#1)*60+#2\if p#3+720 \fi
(#1)*60+#2\if p#3\ifnum#1=12 \else+720\fi\fi
}



\begin{document}

\foo{11:30 am}{01:20 pm}

\end{document}

Wenn Sie die Argumente vor dem Parsen erweitern möchten, wie im bearbeiteten MWE:

\documentclass{article}

\newcommand*{\mystart}{11:30 am}
\newcommand*{\myend}{01:20 pm}

% duration
\def\duration#1#2{%
  {\def\,{ }%
  \edef\tmp{%
   \noexpand\theminutes{%
   \noexpand\the
   \noexpand\numexpr
   (\noexpand\xduration#2\relax)-%
   (\noexpand\xduration#1\relax)\relax}}\tmp}}

\def\xduration#1:#2 #3m#4\relax{%
%(#1)*60+#2\if p#3+720\fi
 (#1)*60+#2\if p#3\ifnum#1=12 \else+720\fi\fi
}

\def\theminutes#1{%
#1\ minute\ifnum#1=1 \else s\fi}

% environment
\newenvironment{tbl}[3]{
  \begin{tabular}{ll}
    #1 & \duration{#2}{#3}\\
  \end{tabular}
}{}

\begin{document}
\begin{tbl}{Duration}{11:30 am}{01:20 pm}% works
\end{tbl}

\begin{tbl}{Duration}{\mystart}{\myend}% Runaway argument? ! File ended while scanning use of \xduration.
\end{tbl}

\begin{tbl}{Duration}{11:30\,am}{01:20\,pm}% works
\end{tbl}



\begin{tbl}{Duration}{12:30 pm}{03:00 pm} % works
\end{tbl}


\begin{tbl}{Duration}{11:30\,am}{11:31\,am}
\end{tbl}


\end{document}

Bildbeschreibung hier eingeben

Antwort2

Um Davids ausgezeichnete Antwort zu erweitern und die alternative Ausgabe zu geben,

xx hour(s) xx minute(s).

NEU BEARBEITET, um die einzelnen „Minuten“ und „Stunden“ zu verwenden, wenn nur eine davon vorhanden ist. Außerdem wurde ein Modulo-Fix angewendet, wenn die Zeit 12:xx war (musste 720 abziehen, um 12 Stunden wie 00 Stunden zu behandeln)

Hier ist das MWE (BEARBEITET, um die Argumente zu erweitern, sodass sie in Makroform übergeben werden können):

\documentclass{article}

\def\foo#1#2{\edef\tmp{\numfoo{#1}{#2}}\tmp\ minute%
  \ifnum\tmp=1\relax\else s\fi}

\def\xfoo#1:#2 #3m#4\relax{(#1)*60+#2\if p#3+720\fi\ifnum#1=12-720\fi}

\def\numfoo#1#2{%
  \the\numexpr(\expandafter\xfoo#2\relax)-(\expandafter\xfoo#1\relax)\relax}

\def\barr#1#2{%
  \edef\tmp{\the\numexpr((\numfoo{#1}{#2})-(30))/60\relax}%
  \tmp\ hour\ifnum\tmp=1\relax\else s\fi\ %
  \edef\tmp{\the\numexpr(\numfoo{#1}{#2})-((\numfoo{#1}{#2})-(30))/60*60}%
  \tmp\ minute\ifnum\tmp=1\relax\else s\fi%
}

\begin{document}
\foo{11:30 am}{01:20 pm} = \barr{11:30 am}{01:20 pm}

\foo{11:30 am}{12:31 pm} = \barr{11:30 am}{12:31 pm}

\foo{12:30 am}{12:31 pm} = \barr{12:30 am}{12:31 pm}

\foo{11:59 am}{12:00 pm} = \barr{11:59 am}{12:00 pm}

\def\starttime{11:30 am}
\def\endtime{03:20 pm}

\foo{\starttime}{\endtime} = \barr{\starttime}{\endtime}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen