]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new function decoded-time-period
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 5 Aug 2020 08:07:13 +0000 (10:07 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 5 Aug 2020 08:07:13 +0000 (10:07 +0200)
* lisp/calendar/time-date.el (decoded-time-period): New function.

etc/NEWS
lisp/calendar/time-date.el
test/lisp/calendar/time-date-tests.el

index f135b3f6b3cc6104cdca5063c737121be793649c..c1879169dd639e4331a28c4989d75a763e3adfab 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -731,6 +731,11 @@ optional argument specifying whether to follow symbolic links.
 ** 'parse-time-string' can now parse ISO 8601 format strings,
 such as "2020-01-15T16:12:21-08:00".
 
+---
+** The new function 'decoded-time-period' has been added.
+It interprets a decoded time structure as a period and returns the
+equivalent period in seconds.
+
 +++
 ** The new function 'dom-remove-attribute' has been added.
 
index eeb09926a6e7c32dae2bab6b921432f54ba133c9..125f9acc70563c0f0e30d406dcc65745509f427a 100644 (file)
@@ -527,6 +527,21 @@ TIME is modified and returned."
 
   time)
 
+(defun decoded-time-period (time)
+  "Interpret DECODED as a period and return its length in seconds.
+For computational purposes, years are 365 days long and months
+are 30 days long."
+  (+ (if (consp (decoded-time-second time))
+         ;; Fractional second.
+         (/ (float (car (decoded-time-second time)))
+            (cdr (decoded-time-second time)))
+       (or (decoded-time-second time) 0))
+     (* (or (decoded-time-minute time) 0) 60)
+     (* (or (decoded-time-hour time) 0) 60 60)
+     (* (or (decoded-time-day time) 0) 60 60 24)
+     (* (or (decoded-time-month time) 0) 60 60 24 30)
+     (* (or (decoded-time-year time) 0) 60 60 24 365)))
+
 (provide 'time-date)
 
 ;;; time-date.el ends here
index 3eecc67eb53f087c2536e0b4f12eb520722529ed..fe1460cf29ebbec3b006efe3a46f4f036172f0e8 100644 (file)
 (ert-deftest test-time-since ()
   (should (time-equal-p 0 (time-since nil))))
 
+(ert-deftest test-time-decoded-period ()
+  (should (equal (decoded-time-period '(nil nil 1 nil nil nil nil nil nil))
+                 3600))
+
+  (should (equal (decoded-time-period '(1 0 0 0 0 0 nil nil nil)) 1))
+  (should (equal (decoded-time-period '(0 1 0 0 0 0 nil nil nil)) 60))
+  (should (equal (decoded-time-period '(0 0 1 0 0 0 nil nil nil)) 3600))
+  (should (equal (decoded-time-period '(0 0 0 1 0 0 nil nil nil)) 86400))
+  (should (equal (decoded-time-period '(0 0 0 0 1 0 nil nil nil)) 2592000))
+  (should (equal (decoded-time-period '(0 0 0 0 0 1 nil nil nil)) 31536000))
+
+  (should (equal (decoded-time-period '((135 . 10) 0 0 0 0 0 nil nil nil))
+                 13.5)))
+
 ;;; time-date-tests.el ends here