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