我有以下风格的约会列表:
| Appointment | Dur. |
|------------------------------+-------|
| <2014-02-20 Thu 09:30-18:30> | ??? |
| <2014-02-22 Sat 09:00-10:00> | ??? |
| | |
如何让orgmode计算约会的持续时间?
答案 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