如何使用TBLFM结合org-evaluation-time-range的结果

时间:2015-12-09 08:11:00

标签: emacs org-mode

在上一篇文章(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)

感谢。

1 个答案:

答案 0 :(得分:1)

$3=$2等公式的右侧由calc评估,而calc7 hour 14 minutes语法一无所知。实际上,calc可以进行符号计算,并将7 hour 14 minutes作为7*hour*14*minuteshour变量的产品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