Browse Source

Fix the date prompt for american-style dates

* lisp/org.el (org-read-date-analyze): Fix regular expression for
matching american dates

Daniel E. Doherty writes:

> In playing around with the date prompt (C-.), I ran across the following
> puzzling behavior from rather simple inputs.
> I entered the following on June 1, 2010.  Here is a date entered as
> "3/15": <2011-03-15 Tue>.  It interpreted it as the upcoming March 15 as
> expected.
> But here is a date entered as "5/21": <2021-06-05 Sat>.  Note how it
> interpreted the "21" as the year 2021, not at all what I expected from
> the documentation or the analogous "3/15" example.
> Maybe there is some underlying logic here that I'm not getting.  Perhaps
> it has to do with how 2-digit years are interpreted?
> What's going on here?  I am using org-version 6.36trans on emacs 23.1.

What was going on here is that the regular expression for matching
american-style dates was wrong.  It was looking for month numbers in
the second field and day numbers in the first field - wrong, of
Carsten Dominik 11 years ago
1 changed files with 8 additions and 3 deletions
  1. 8 3

+ 8 - 3

@@ -13942,10 +13942,15 @@ The prompt will suggest to enter an ISO date, but you can also enter anything
 which will at least partially be understood by `parse-time-string'.
 Unrecognized parts of the date will default to the current day, month, year,
 hour and minute.  If this command is called to replace a timestamp at point,
-of to enter the second timestamp of a range, the default time is taken from the
-existing stamp.  For example,
+of to enter the second timestamp of a range, the default time is taken
+from the existing stamp.  Furthermore, the command prefers the future,
+so if you are giving a date where the year is not given, and the day-month
+combination is already past in the current year, it will assume you
+mean next year.  For details, see the manual.  A few examples:
   3-2-5         --> 2003-02-05
   feb 15        --> currentyear-02-15
+  2/15          --> currentyear-02-15
   sep 12 9      --> 2009-09-12
   12:45         --> today 12:45
   22 sept 0:34  --> currentyear-09-22 0:34
@@ -14191,7 +14196,7 @@ user."
 			       t nil ans)))
     ;; Help matching american dates, like 5/30 or 5/30/7
     (when (string-match
-	   "^ *\\([0-3]?[0-9]\\)/\\([0-1]?[0-9]\\)\\(/\\([0-9]+\\)\\)?\\([^/0-9]\\|$\\)" ans)
+	   "^ *\\(0?[1-9]\\|1[012]\\)/\\(0?[1-9]\\|[12][0-9]\\|3[01]\\)\\(/\\([0-9]+\\)\\)?\\([^/0-9]\\|$\\)" ans)
       (setq year (if (match-end 4)
 		     (string-to-number (match-string 4 ans))
 		   (progn (setq kill-year t)