Using a formula to compute tasks duration in org-mode tables

I recently became more mindful about how I spend my time, because time is so precious. Every night, I plan how I will be spending time the next day. As you may expect if you have been reading my blog, I am using org-mode to track that; more specifically, I put the entries in a table like this one:

|---------------+--------------+------------|
| Time          | Activity     | Duration   |
|---------------+--------------+------------|
| 7:30 - 8:00   | Breakfast    | 30 minutes |
| 8:00 - 12:00  | Work         | 4 hours    |
| 12:00 - 12:30 | Go on a walk | 30 minutes |
| 12:30 - 13:00 | Eat lunch    | 30 minutes |

I don't like to do the manual work of figuring out the duration from the time. Following one of my favorite xkcd, "is it worth the time?" I analyzed the problem:

https://imgs.xkcd.com/comics/is_it_worth_the_time.png

I am probably doing this 5 to 50 times per day depending on how many entries I have, and it takes me 5 seconds. So if I can solve the problem and automate it in less than 12 hours, it is worth it if I keep that routine for 5 years. Even if I keep the routine for 6 months, I can spend over an hour solving the problem! It took me a few minutes to come up with the following emacs-lisp snippet to compute a time difference:

(require 'ts)

(defun to-duration (tdiff)
(let* ((a (s-split " - " tdiff))
       (t1 (ts-parse (nth 0 a)))
       (t2 (ts-parse (nth 1 a))))
  (if (> (ts-unix t2) (ts-unix t1))
      (ts-human-format-duration
       (ts-difference t2 t1))
    (ts-human-format-duration
     (ts-difference (ts-adjust  'hour +12 t2) (ts-adjust 'hour -12 t1))))))

(to-duration "8:30 - 9:00") ;;-> 30 minutes
(to-duration "20:30 - 2:00") ;;-> 5 hours, 30 minutes

Then all that's left to do is adding a formula to the table to get the duration computed automatically:

|---------------+--------------+------------|
| Time          | Activity     | Duration   |
|---------------+--------------+------------|
| 7:30 - 8:00   | Breakfast    | 30 minutes |
| 8:00 - 12:00  | Work         | 4 hours    |
| 12:00 - 12:30 | Go on a walk | 30 minutes |
| 12:30 - 13:00 | Eat lunch    | 30 minutes |
#+TBLFM: $3='(to-duration $1)'