[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How to get time difference with Elisp?
From: |
tomas |
Subject: |
Re: How to get time difference with Elisp? |
Date: |
Tue, 12 Jul 2016 13:14:09 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Tue, Jul 12, 2016 at 12:46:37PM +0200, Karl Voit wrote:
> Hi!
>
> I need to determine total office hours of a day without the time
> spent in lunch break. The source data is officebegin, officeend,
> lunchbreakbegin, lunchbreakend - all in string format "HH:MM" like
> "14:58".
>
> So far, I failed miserably to find the right combination of
> parse-time-string, encode-time, time-substract.
>
> Even determining the difference between only two times resulted in
> errors to me:
>
> (setq difference (time-subtract (encode-time (parse-time-string "12:24"))
> (encode-time (parse-time-string "11:45"))))
>
> ... results in: time-subtract: Wrong number of arguments: encode-time, 1
The immediate problem is that parse-time-string returns a list of values,
but encode-time expects separate arguments. Apply takes care of that:
(apply #'encode-time (parse-time-string "12:24"))
etc.
Now the problem is that for your time string day, month, year turn up
as nil, something encode-time doesn't like at all. I guess you'd have
to fill in missing stuff with the values from current-time. Here's
a rough sketch to start with:
(let ((time-default (decode-time (current-time))))
(setq difference
(time-subtract
(encode-time
(mapcar* (lambda (x y) (or x y))
(apply #'encode-time (parse-time-string "12:24"))
time-default))
(encode-time
(mapcar* (lambda (x y) (or x y))
(apply #'encode-time (parse-time-string "11:45"))
time-default))
Of course, there might be functions around which make this much simpler.
If not, I think abstracting away some part as a function might enhance
readability a lot.
Note that I used mapcar* which I think is part of cl.
regards
- -- tomás
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
iEYEARECAAYFAleE0QEACgkQBcgs9XrR2ka3eQCfYdyZO6g6E0UKND1RgcOkPItV
qPoAn0iFvEQ5ioJphRIA0BbNYHIXgKVA
=71DO
-----END PGP SIGNATURE-----