使用 datetime2,如果我有以分钟为单位的持续时间,是否有办法根据开始时间计算结束时间?例如
\newcommand*\timespan{90}
\newcommand*\starttime{13:45:00}
\DTMtime{\starttime+\timespan}
(类似于\DTMdate
您可以添加天数的地方)
我在文档中没有看到任何内容,但我有印象它可能通过\DTMfetchhour
和实现\DTMfetchminute
。
(这里的背景是固定持续时间内改变开始时间,我想自动输出包括结束时间在内的整个时间段)
答案1
这是一个初步版本,使用expl3
特征并计算总秒数,然后分割并计算新的时间。
它并不表示时间跨度超过 24 小时,因此使用 1440(分钟)的倍数的时间跨度将导致与开始时间相同的时间。
午夜之后的小时值包装已完成。
datetime2
没有提供用于计算时间跨度或以小时:分钟:秒为单位的结束时间的宏——有一些有关日期的计算宏。
\documentclass{article}
\usepackage{xparse}
\usepackage{datetime2}
\newcommand*\timespan{90}
\newcommand*\starttime{13:45:00}
\ExplSyntaxOn
\cs_generate_variant:Nn \int_set:Nn {NV}
\cs_generate_variant:Nn \seq_set_split:Nnn {NVn,NVV}
\NewDocumentCommand{\endtime}{+m+m}{%
\group_begin:
\tl_set:Nx \l_tmpa_tl {#1}
\seq_set_split:NVV \l_tmpa_seq {\c_colon_str} \l_tmpa_tl
\exp_args:NNx \fp_set:Nn \l_tmpa_fp {\seq_item:Nn \l_tmpa_seq {1} * 3600 + \seq_item:Nn \l_tmpa_seq {2} * 60 + \seq_item:Nn \l_tmpa_seq {3} }
\exp_args:NNx \fp_set:Nn \l_tmpb_fp {#2 * 60}
\fp_add:Nn \l_tmpa_fp {#2 * 60}
\tl_clear:N \l_tmpa_tl
% Compute hours
\exp_args:NNx \int_set:Nn \l_tmpa_int {\int_div_truncate:nn {\fp_use:N \l_tmpa_fp}{3600}}
\int_compare:nNnTF {\l_tmpa_int } > {23} {% After midnight?
\exp_args:NNx \int_set:Nn \l_tmpb_int {\int_mod:nn {\l_tmpa_int } {24}}
}{%
\int_set_eq:NN \l_tmpb_int \l_tmpa_int
}
\tl_put_right:NV \l_tmpa_tl {\l_tmpb_int\c_colon_str}
% Remaining seconds, split them into minutes and seconds
\int_set:Nn \l_tmpa_int {\fp_use:N \l_tmpa_fp}
\exp_args:NNx \int_set:Nn \l_tmpb_int {\int_mod:nn {\l_tmpa_int}{3600}}
\exp_args:NNx \int_set:Nn \l_tmpb_int {\int_div_truncate:nn {\l_tmpb_int}{60}}
\tl_put_right:NV \l_tmpa_tl {\l_tmpb_int\c_colon_str}
% Finally splitting: Seconds
\exp_args:NNx \int_set:Nn \l_tmpa_int {\int_mod:nn {\l_tmpa_int}{60}}
\tl_put_right:NV \l_tmpa_tl {\l_tmpa_int}
% Display output:
\exp_args:NV \DTMtime{\l_tmpa_tl}
\group_end:
}
\ExplSyntaxOff
\begin{document}
We started at \expandafter\DTMtime\expandafter{\starttime}
The event lasts \timespan\ minutes
It ends at \endtime{\starttime}{\timespan}
\end{document}