2 つの時点の差を計算するにはどうすればよいでしょうか (例: 午前 11:30 と午後 1:20 => 110 分)?

2 つの時点の差を計算するにはどうすればよいでしょうか (例: 午前 11:30 と午後 1:20 => 110 分)?

2 つの時間 (同じ日) の差を計算する簡単な方法はありますか? たとえば、午前 11:30 と午後 1:20 は 110 分 (または 1 時間 50 分) になりますか? パッケージを確認しましたがdatenumber、日差を計算するだけのようです (したがって、より大きなスケールで機能します)。[(醜い?) 文字列の「分割統治」アプローチ以外に、問題を開始するエレガントな方法がないため、最小限の例は含めませんでした]

わかりました。私も、datetimeどちらがより有望であるかを発見しました。とはいえ、このパッケージで時間点の差を計算する方法がわかりません (またはcalc?)

アップデート David の回答の後、私は MWE を元の例に拡張し、次のRunaway argument問題に気付きました。

\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}

これを避けるにはどうしたらいいでしょうか? [別のペアは{}役に立ちませんでした]

答え1

\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}

編集された 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}

ここに画像の説明を入力してください

答え2

デイビッドの素晴らしい回答を拡張して、別の出力を示します。

xx hour(s) xx minute(s)

「分」と「時間」が 1 つしかない場合は、単数形を使用するように再編集しました。また、時間が 12:xx の場合にモジュロ修正を適用しました (12 時間を 00 時間のように扱うには 720 を減算する必要がありました)

以下は MWE です (引数を拡張してマクロ形式で渡せるように編集されています)。

\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}

ここに画像の説明を入力してください

関連情報