在上一篇文章(Calculate time range in org-mode table)中,我能够在表格中使用org-evaluate-time-range函数。
我想总结所获得的持续时间。但是,在搜索如何执行此操作时,我注意到TBLFM模式的以下行为。
| <2015-12-09 01:29>--<2015-12-09 08:43> | 7 hours 14 minutes | 98 hours minutes |
| <2015-12-09 08:29>--<2015-12-09 08:43> | 14 minutes | 14 minutes |
#+TBLFM: $2='(org-evaluate-time-range)::$3=$2
在第三列中,似乎是计算的产品。有什么理由吗?
我想要的是将持续时间与像
这样的宏相加#+TBLFM: $2='(org-evaluate-time-range)::@3$2=vsum(@1$2..@2$2)
感谢。
答案 0 :(得分:1)
$3=$2
等公式的右侧由calc
评估,而calc
对7 hour 14 minutes
语法一无所知。实际上,calc
可以进行符号计算,并将7 hour 14 minutes
作为7*hour*14*minutes
和hour
变量的产品minutes
读取。
calc
理解的时间语法是HH:MM[:SS]
。这由org-mode manual说明。
TBLFM:
有一个标记;T
,可以将数值格式化为时间,但这对时间戳范围不起作用。因此,如果您真的想从时间戳范围开始,可能一种方法是编写自己的函数将范围转换为秒:
Evaluate this first:
#+BEGIN_SRC emacs-lisp
(defun convert-time-range-to-seconds (range)
(if (string-match org-tr-regexp-both range)
(let ((start (match-string 1 range))
(end (match-string 2 range)))
(round (- (org-time-string-to-seconds end)
(org-time-string-to-seconds start))))
""))
#+END_SRC
| time stamp range | as seconds | as time |
|------------------------------------------------+------------+-----------|
| <2015-12-09 Wed 01:29>--<2015-12-10 Thu 08:42> | 112380 | 31:13:00 |
| <2015-12-28 Mon>--<2015-12-31 Thu> | 259200 | 72:00:00 |
| <2015-12-11 Fri>--<2015-12-13 Sun> | 172800 | 48:00:00 |
|------------------------------------------------+------------+-----------|
| | | 151:13:00 |
#+TBLFM: $2='(convert-time-range-to-seconds $1)::$3=$2;T::@>$3=vsum(@2..@-1);T