使用 datetime2 计算时间跨度

使用 datetime2 计算时间跨度

使用 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}

相关内容