计算组织模式表中的约会持续时间

时间:2014-02-22 10:33:41

标签: emacs org-mode tabular

我有以下风格的约会列表:

| Appointment                  | Dur.  |
|------------------------------+-------|
| <2014-02-20 Thu 09:30-18:30> |  ???  |
| <2014-02-22 Sat 09:00-10:00> |  ???  |
|                              |       |

如何让orgmode计算约会的持续时间?

1 个答案:

答案 0 :(得分:2)

组织模式允许您指定用于计算给定列的值的公式。您可以在这些公式中执行elisp代码。我们可以使用功能来实现您想要的功能,我们需要定义一些能够找到时间差异的功能。您可以将以下内容添加到组织文档

#+begin_src emacs-lisp
  (defun my-get-number-of-minutes (time)
    (+ (* (nth 2 time) 60) (nth 1 time)))

  (defun my-get-time-diff (t1 t2)
    (- (my-get-number-of-minutes t1) (my-get-number-of-minutes t2)))

  (defun my-get-duration (time-string)
    (let* ((times (split-string (substring time-string 16 -1) "-"))
           (minute-diff (my-get-time-diff (parse-time-string (nth 1 times))
                                          (parse-time-string (nth 0 times)))))
      (format "%dhrs %dmins" (/ minute-diff 60) (% minute-diff 60))))
#+end_src

然后在#+begin-src emacs-lisp#+end-src标签之间的任何地方执行 C-c C-c ,这将评估elisp。

OR

只需将elisp代码(在#+begin_src emacs-lisp #+end-src之间)复制到*scratch*缓冲区,然后执行 Mx eval-buffer RET

现在我们已经定义了函数,我们可以告诉org-mode公式来计算第一列的第二列,为此只需在org-table下面粘贴以下行

#+TBLFM: $2='(my-get-duration $1)

这告诉组织第2列($2)的值是函数my-get-duration应用'第1列的值'($2)。然后使用点上的点做 C-c C-c ,如果你做得很好,第二列应填充持续时间。

注意:代码假定日期时间与示例中给出的格式相同。

我建议您阅读有关org-mode功能的this简短文章作为电子表格。

<强>更新

如果您可以按如下方式重新格式化表格,则可以简化公式

| Appointment      | Start |   End | Duration |
|------------------+-------+-------+----------|
| <2014-02-20 Thu> | 09:30 | 18:30 | ???      |
| <2014-02-22 Sat> | 09:00 | 10:00 | ???      |

现在计算持续时间的公式只是

#+TBLFM: $4=$3-$2;T