summaryrefslogtreecommitdiff
path: root/lisp/calc
diff options
context:
space:
mode:
authorMattias Engdegård <mattiase@acm.org>2020-10-02 18:50:50 +0200
committerMattias Engdegård <mattiase@acm.org>2020-10-02 22:24:54 +0200
commit0ade20f49f80d2d93f596ba9dfa3f1309ad84126 (patch)
tree5b07796eece45179b7abb21d10de5551ac5c6eea /lisp/calc
parent6a6466031839d5fb4efadbfe2cdbd5ba469dd9c6 (diff)
downloademacs-0ade20f49f80d2d93f596ba9dfa3f1309ad84126.tar.gz
emacs-0ade20f49f80d2d93f596ba9dfa3f1309ad84126.tar.bz2
emacs-0ade20f49f80d2d93f596ba9dfa3f1309ad84126.zip
Calc: fix formatting and parsing Unix time (bug#43759)
The number of days from epoch to Jan 1, 1970 that was used in parsing and formatting Unix time was incorrect. The previous fix (in e368697ce36) was incomplete. Reported by Vincent Belaïche. * lisp/calc/calc-forms.el (math-unix-epoch): New constant. (math-format-date-part, math-parse-standard-date, calcFunc-unixtime): Use math-unix-epoch instead of a constant that is sometimes wrong. * test/lisp/calc/calc-tests.el (calc-unix-date): New test.
Diffstat (limited to 'lisp/calc')
-rw-r--r--lisp/calc/calc-forms.el13
1 files changed, 9 insertions, 4 deletions
diff --git a/lisp/calc/calc-forms.el b/lisp/calc/calc-forms.el
index 6d70126c098..a2f66968665 100644
--- a/lisp/calc/calc-forms.el
+++ b/lisp/calc/calc-forms.el
@@ -709,6 +709,10 @@ as measured in the number of days before December 31, 1 BC (Gregorian).")
"The beginning of the Julian date calendar,
as measured in the integer number of days before December 31, 1 BC (Gregorian).")
+(defconst math-unix-epoch 719163
+ "The beginning of Unix time: days from December 31, 1 BC (Gregorian)
+to Jan 1, 1970 AD.")
+
(defun math-format-date-part (x)
(cond ((stringp x)
x)
@@ -730,7 +734,8 @@ as measured in the integer number of days before December 31, 1 BC (Gregorian)."
(math-floor math-fd-date)
math-julian-date-beginning-int)))
((eq x 'U)
- (math-format-number (nth 1 (math-date-parts math-fd-date 719164))))
+ (math-format-number (nth 1 (math-date-parts math-fd-date
+ math-unix-epoch))))
((memq x '(IYYY Iww w))
(progn
(or math-fd-iso-dt
@@ -1173,7 +1178,7 @@ as measured in the integer number of days before December 31, 1 BC (Gregorian)."
(setq num (math-match-substring math-pd-str 0)
math-pd-str (substring math-pd-str (match-end 0))
num (math-date-to-dt
- (math-add 719164
+ (math-add math-unix-epoch
(math-div (math-read-number num)
'(float 864 2))))
hour (nth 3 num)
@@ -1434,11 +1439,11 @@ as measured in the integer number of days before December 31, 1 BC (Gregorian)."
(defun calcFunc-unixtime (date &optional zone)
(if (math-realp date)
(progn
- (setq date (math-add 719163 (math-div date '(float 864 2))))
+ (setq date (math-add math-unix-epoch (math-div date '(float 864 2))))
(list 'date (math-sub date (math-div (calcFunc-tzone zone date)
'(float 864 2)))))
(if (eq (car date) 'date)
- (math-add (nth 1 (math-date-parts (nth 1 date) 719163))
+ (math-add (nth 1 (math-date-parts (nth 1 date) math-unix-epoch))
(calcFunc-tzone zone date))
(math-reject-arg date 'datep))))