[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [O] dates before 1970
From: |
Nick Dokos |
Subject: |
Re: [O] dates before 1970 |
Date: |
Thu, 10 Mar 2011 18:06:33 -0500 |
Eric S Fraga <address@hidden> wrote:
> This is a sort of bug report but possibly more a curiosity...
>
> I imagine this has something to do with time 0 in Unix but I cannot seem
> to be able to enter any date earlier than 1 Jan 1970 using C-c! (say).
> However, once I have entered a date (later than that), I can use
> S-<down> on the year to get to the date I want. This seems rather
> inconsistent?
>
> To be precise, I get the wrong date recorded if I try:
>
> C-c ! 1968-12-10 RET
>
> (where C-c ! is =org-time-stamp-inactive=).
> The result is =[2011-12-10 Sat]=
>
> The bug is not so much that I cannot input dates I want but that the
> inactive timestamp generated is *incorrect* and yet there is no error
> message.
>
Good one! The culprit is org-read-date-analyze which near the end contains
this snippet of code:
,----
| ...
| (if (< year 100) (setq year (+ 2000 year)))
| (if (< year 1970) (setq year (nth 5 defdecode))) ; not representable
| (setq org-read-date-analyze-futurep futurep)
| (list second minute hour day month year)))
`----
The trouble is that the caller (org-read-date) takes the result and
does a round-trip through the emacs time encode/decode functions to make
sure the result is sane. Dates before 1970 would break that (I get (0 9
10 26 11 2033 6 nil -18000)) so it seems it wraps around to 2033 or so).
In addition, most callers of org-read-date call it with a non-nil
to-time argument: that makes it return an emacs-encoded time (which is
then manipulated as such and which I believe has to satisfy the >=1970
requirement).
So I'd guess raising an exception might be the simplest way to deal with
this. Here's a patch to try out:
--8<---------------cut here---------------start------------->8---
diff --git a/lisp/org.el b/lisp/org.el
index 92f2406..b9acf11 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -14718,7 +14718,8 @@ user."
(nth 2 tl))
(setq org-time-was-given t))
(if (< year 100) (setq year (+ 2000 year)))
- (if (< year 1970) (setq year (nth 5 defdecode))) ; not representable
+; (if (< year 1970) (setq year (nth 5 defdecode))) ; not representable
+ (if (< year 1970) (error "Year must be >= 1970"))
(setq org-read-date-analyze-futurep futurep)
(list second minute hour day month year)))
--8<---------------cut here---------------end--------------->8---
I think it does not break anything but I'm not sure I like it much.
Patchwork note: this should not be applied without a lot more thought
and experimentation.
Nick
- [O] dates before 1970, Eric S Fraga, 2011/03/10
- Re: [O] dates before 1970,
Nick Dokos <=
- Re: [O] dates before 1970, Bastien, 2011/03/11
- Re: [O] dates before 1970, Carsten Dominik, 2011/03/11
- Re: [O] dates before 1970, Carsten Dominik, 2011/03/13
- Re: [O] dates before 1970, Eric S Fraga, 2011/03/13
- Re: [O] dates before 1970, Carsten Dominik, 2011/03/14
- Re: [O] dates before 1970, Bastien, 2011/03/14
Re: [O] dates before 1970, Eric S Fraga, 2011/03/11