Eric S Fraga <e.fr...@ucl.ac.uk> 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