두 시점(예: 오전 11시 30분과 오후 1시 20분 => 110분) 간의 차이를 계산하는 방법은 무엇입니까?

두 시점(예: 오전 11시 30분과 오후 1시 20분 => 110분) 간의 차이를 계산하는 방법은 무엇입니까?

두 시간(같은 날)의 차이를 계산하는 간단한 방법이 있습니까? 예를 들어 오전 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

David의 탁월한 답변을 확장하여 다음과 같은 대체 출력을 제공합니다.

xx hour(s) xx minute(s).

단수 "분"과 "시간"이 하나만 있는 경우 단수형 "분"과 "시간"을 사용하도록 재편집되었습니다. 또한 시간이 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}

여기에 이미지 설명을 입력하세요

관련 정보