From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Moe Subject: Re: org table calc and lisp for hh:mm timetable Date: Tue, 22 Mar 2011 10:36:11 +0100 Message-ID: <4D886D8B.10401@christianmoe.com> References: <9999237C-1FBD-481E-AF8D-D68DB85080CE@gmail.com> <87lj0gqjd3.fsf@ucl.ac.uk> <0DDD90AF-9B9A-4FE3-8080-74EF01E6E292@gmail.com> <4D7FDE8C.1030103@christianmoe.com> <00BD91C6-C610-4CDD-B3E0-E9FECDAA372C@gmail.com> <87k4fynog3.fsf@altern.org> <87lj09llzd.fsf@gmail.com> <4D866AD7.4020701@christianmoe.com> <87fwqhl5mu.fsf@gmail.com> <87mxknhioh.fsf@gmail.com> Reply-To: mail@christianmoe.com Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from [140.186.70.92] (port=34377 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q1xxK-0007yl-7o for emacs-orgmode@gnu.org; Tue, 22 Mar 2011 05:32:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q1xxJ-00065w-6L for emacs-orgmode@gnu.org; Tue, 22 Mar 2011 05:32:50 -0400 Received: from mars.hitrost.net ([91.185.211.18]:31678) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q1xxI-00065Q-T4 for emacs-orgmode@gnu.org; Tue, 22 Mar 2011 05:32:49 -0400 In-Reply-To: <87mxknhioh.fsf@gmail.com> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Eric Schulte Cc: Bastien , emacs-orgmode@gnu.org, Martin Halder Hi, If we're not just looking for a neat workaround for some special cases anymore, but looking at making org-tables aware of time-like strings by default, a better strategy than to convert them into integers might be to translate them into Calc time format and back again. After all, Calc and hence the Org spreadsheet already handles time arithmetic perfectly well, it's just that it would be nice to have this functionality with the extra option to enter and display times as =12:45= rather than =12@ 45'= or =12h 45m=. (Personally, I can live with a =12h 45m= format, which is already a Calc option: info:calc#HMS%20Forms, info:calc#HMS%20Formats.) Consider this: | Departure | Travel time | Arrival | |------------------------+-------------+------------------------| | [2011-03-22 Tue 23:15] | 7@ 05' | <2011-03-23 Wed 06:20> | #+TBLFM: $3=<$1>+$2 With Calc, you can add a HMS time to a date-time and get the resulting date-time. However, Calc apparently interprets integers as days, not minutes or seconds. So if you convert 7:05 to an integer (425) and add it to a date-time, you get a date about one year and two months ahead. (Converting 7:05 to the integer 0.295139 days would work... but with rounding problems.) The Org spreadsheet already allows us to give the date-time as an Org-style timestamp rather than in the Calc date format by using the angle brackets in the formula. The solution would be similar option for time-like strings, so we could write the travel time above as =7:05=, and so the result below would be returned as =7:05=. | Arrival | Departure | Travel time | |------------------------+------------------------+-------------| | <2011-03-23 Wed 06:20> | [2011-03-22 Tue 23:15] | 7@ 5' 0" | #+TBLFM: $3=time(<$1>-<$2>) Yours, Christian On 3/22/11 5:40 AM, Eric Schulte wrote: >> >> While this topic is raised, would it make sense for Org-mode table >> formula to automatically parse any time-like string into time units >> (i.e., base sixty). That would be the easiest for most users, and (I >> imagine) would rarely result in surprising and unexpected behavior. >> > > So, I took a shot at folding this into org-table.el, the resulting patch > is attached. I'm not sure if this sort of automatic interpretation of > time-like strings into integers is a good idea, or if this is the best > implementation (I'm not incredibly familiar with Org's table handling) > but after a couple of simple tests the patch does seem to work. For > example the following... > > | 2:30 | 2 | 75 | > #+TBLFM: $3=$1/$2 > > It may make sense to also include functionality for converting the > result back into a time string, e.g. > > #+begin_src emacs-lisp > (defun org-time-seconds-to-string (secs) > "Convert a number of seconds to a time string." > (cond ((>= secs 3600) (format-seconds "%h:%.2m:%.2s" secs)) > ((>= secs 60) (format-seconds "%m:%.2s" secs)) > (t (format-seconds "%s" secs)))) > #+end_src > > | 2:30 | 2 | 1:15 | > #+TBLFM: $3='(org-time-seconds-to-string (/ (string-to-number $1) (string-to-number $2))) > > While the above is cumbersome, there may be a simpler syntax or > convention -- e.g., whenever one of the inputs is a time string then the > results are displayed as a time string. Not sure what the best option > is here, but thought this patch may spur some good suggestions. > > Best -- Eric >