![计算不同日期的两个时间点之间的差值](https://linux22.com/image/301619/%E8%AE%A1%E7%AE%97%E4%B8%8D%E5%90%8C%E6%97%A5%E6%9C%9F%E7%9A%84%E4%B8%A4%E4%B8%AA%E6%97%B6%E9%97%B4%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%B7%AE%E5%80%BC.png)
这是如何计算两个时间点之间的差异(例如上午 11:30 和下午 01:20 => 110 分钟)?。
考虑一下大卫优秀答案中的代码这里:
\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}
宏可以扩展以处理不同日期之间的时间差异吗?(例如,计算从 11 月 15 日下午 17:20 到 11 月 18 日上午 9:00 的分钟数。)
更新
继好回答对于 Steven B. Segletes,我想省略<a> day(s)
、<b> hour(s)
和/或<c> minute(s)
如果值为零。
例1:我想\timediff{2014}{10}{12}{11:30 am}{2014}{10}{12}{01:20 pm}
生产1 hour and 50 minutes
。
例 2:我想\timediff{2014}{10}{12}{11:30 am}{2014}{10}{14}{08:50 am}
生产。[我假设1 day, 21 hours and 20 minutes
我可以自己实现附加的,
和。]and
更新 2
我还忘了两件事:
- 我可以获得输出吗
<a> days, <b> hours and <c> minutes = <d> minutes
,即在几分钟内获得输出? - 是否可以输入一天中的时间,其中
<p>:<q>
是<p>
0 到 24 之间的整数,<q>
是 0 到 59 之间的整数,而不是<p>:<q> am
/<p>:<q> pm
?
(添加最后一点后我会立即接受你的回答。)
答案1
使用该datenumber
包进行日运算,并使用我之前对 OP 所提问题的回答作为 hr:mm 运算的基础。该datenumber
包允许将日期转换为计数器数字(相对于参考日期)。
语法是:
\timediff{year1}{month1}{day1}{h1:m1 am/pm}{year2}{month2}{day2}{h2:m2 am/pm}
已编辑,提供[m]
可选参数,允许仅以分钟为单位输出。还提供\ampm[T/F]
将小时分钟设置为{1:31 pm}
(T) 或{13:31}
(F)。
我应该指出,没有对输入的有效范围进行错误检查。
\documentclass{article}
\usepackage{datenumber}
\gdef\mornaft{}
\def\xfoo#1:#2 #3m#4\relax{(#1)*60+#2\if p#3+720\fi\ifnum#1=12-720\fi}
\newcommand\ampm[1][T]{%
\if T#1%
\def\numfoo##1##2{%
\the\numexpr(\expandafter\xfoo##2\mornaft\relax)-%
(\expandafter\xfoo##1\mornaft\relax)\relax}%
\else%
\def\numfoo##1##2{%
\the\numexpr(\expandafter\xfoo##2 am\relax)-%
(\expandafter\xfoo##1 am\relax)\relax}%
\fi
}
\ampm
\def\barr#1#2{%
\edef\tmp{\the\numexpr((\numfoo{#1}{#2})-(30))/60\relax}%
\ifnum\tmp<0\relax\addtocounter{mydays}{-1}%
\edef\tmp{\the\numexpr\tmp+24\relax}\fi%
\ifnum\themydays=0\relax\else
\themydays\ day\ifnum\themydays=1\else s\fi,\ \fi%
\tmp\ hour\ifnum\tmp=1\relax\else s\fi\ and\ %
\edef\tmp{\the\numexpr(\numfoo{#1}{#2})-((\numfoo{#1}{#2})-(30))/60*60}%
\tmp\ minute\ifnum\tmp=1\relax\else s\fi%
}
\def\barm#1#2{%
\edef\tmp{\the\numexpr(\value{mydays})*60*24+\numfoo{#1}{#2}}%
\tmp\ minute\ifnum\tmp=1\else s\fi%
}
\newcounter{mystartdate}
\newcounter{mydays}
\newcommand\timediff[9][d]{%
\setdatenumber{#2}{#3}{#4}%
\setcounter{mystartdate}{\value{datenumber}}%
\setdatenumber{#6}{#7}{#8}%
\setcounter{mydays}{\numexpr\value{datenumber}-\value{mystartdate}}%
\if#1m\barm{#5}{#9}\else\barr{#5}{#9}\fi%
}
\begin{document}
\timediff{2014}{10}{12}{11:30 am}{2014}{10}{12}{01:20 pm}
\timediff{2014}{10}{12}{11:30 am}{2014}{10}{14}{08:50 am}
\timediff{2014}{10}{12}{11:30 am}{2014}{11}{14}{07:00 am}
\timediff{2014}{10}{12}{11:30 am}{2014}{11}{14}{12:31 pm}=
\timediff[m]{2014}{10}{12}{11:30 am}{2014}{11}{14}{12:31 pm}
\timediff[m]{2014}{10}{12}{11:30 am}{2014}{10}{12}{11:31 am}
\ampm[F]
\timediff{2014}{10}{12}{11:30}{2014}{10}{12}{23:31}
\timediff[m]{2014}{10}{12}{11:30}{2014}{10}{12}{23:31}
\end{document}
答案2
你可以花一两个小时用 TeX 写这个,或者直接--shell-escape
使用
\documentclass{article}
\begin{document}
\edef\pc{\csname @percentchar\endcsname}
\def\foo#1#2{%
time between #1 and #2 is
\input{"|echo '(' ` date --date '#1' +\pc s` - `date --date '#2' +\pc s` ')/60' | bc"}%
minutes}
\foo{9am November 19 2014}{5pm November 15 2014}
\end{document}