changeset 76554:cabce7b4c4cc

(math-parse-date): Fix a regular expression. (math-std-daylight-savings-old, math-std-daylight-savings-new): New functions. (math-std-daylight-savings): Use `math-std-daylight-savings-new' or `math-std-daylight-savings-old' depending on year.
author Jay Belanger <jay.p.belanger@gmail.com>
date Mon, 19 Mar 2007 03:16:20 +0000
parents 1967e51d640e
children a66dd73ee29f
files lisp/calc/calc-forms.el
diffstat 1 files changed, 36 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/calc/calc-forms.el	Mon Mar 19 01:06:13 2007 +0000
+++ b/lisp/calc/calc-forms.el	Mon Mar 19 03:16:20 2007 +0000
@@ -727,8 +727,8 @@
 	      (a nil) (b nil) (c nil) (bigyear nil) temp)
 
 	  ;; Extract the time, if any.
-	  (if (or (string-match "\\([0-9][0-9]?\\):\\([0-9][0-9]?\\)\\(:\\([0-9][0-9]?\\(\\.[0-9]+\\)?\\)\\)? *\\([ap]m?\\|[ap]\\. *m\\.\\|noon\\|n\\>\\|midnight\\|mid\\>\\|m\\>\\)?" math-pd-str)
-		  (string-match "\\([0-9][0-9]?\\)\\(\\)\\(\\(\\(\\)\\)\\) *\\([ap]m?\\|[ap]\\. *m\\.\\|noon\\|n\\>\\|midnight\\|mid\\>\\|m\\>\\)" math-pd-str))
+	  (if (or (string-match "\\([0-9][0-9]?\\):\\([0-9][0-9]?\\)\\(:\\([0-9][0-9]?\\(\\.[0-9]+\\)?\\)\\)? *\\([ap]\\>\\|[ap]m\\|[ap]\\. *m\\.\\|noon\\|n\\>\\|midnight\\|mid\\>\\|m\\>\\)?" math-pd-str)
+		  (string-match "\\([0-9][0-9]?\\)\\(\\)\\(\\(\\(\\)\\)\\) *\\([ap]\\>\\|[ap]m\\|[ap]\\. *m\\.\\|noon\\|n\\>\\|midnight\\|mid\\>\\|m\\>\\)" math-pd-str))
 	      (let ((ampm (math-match-substring math-pd-str 6)))
 		(setq hour (string-to-number (math-match-substring math-pd-str 1))
 		      minute (math-match-substring math-pd-str 2)
@@ -1313,7 +1313,19 @@
 
 (defun math-std-daylight-savings (date dt zone bump)
   "Standard North American daylight saving algorithm.
-This implements the rules for the U.S. and Canada as of 2007.
+Before 2007, this uses `math-std-daylight-savings-old', where
+daylight savings began on the first Sunday of April at 2 a.m.,
+and ended on the last Sunday of October at 2 a.m.
+As of 2007, this uses `math-std-daylight-savings-new', where
+daylight saving begins on the second Sunday of March at 2 a.m.,
+and ends on the first Sunday of November at 2 a.m."
+  (if (< (car dt) 2007)
+      (math-std-daylight-savings-old date dt zone bump)
+    (math-std-daylight-savings-new date dt zone bump)))
+
+(defun math-std-daylight-savings-new (date dt zone bump)
+  "Standard North American daylight saving algorithm as of 2007.
+This implements the rules for the U.S. and Canada.
 Daylight saving begins on the second Sunday of March at 2 a.m.,
 and ends on the first Sunday of November at 2 a.m."
   (cond ((< (nth 1 dt) 3) 0)
@@ -1332,6 +1344,27 @@
 		 (t 0))))
 	(t 0)))
 
+(defun math-std-daylight-savings-old (date dt zone bump)
+  "Standard North American daylight savings algorithm before 2007.
+This implements the rules for the U.S. and Canada.
+Daylight savings begins on the first Sunday of April at 2 a.m.,
+and ends on the last Sunday of October at 2 a.m."
+  (cond ((< (nth 1 dt) 4) 0)
+	((= (nth 1 dt) 4)
+	 (let ((sunday (math-prev-weekday-in-month date dt 7 0)))
+	   (cond ((< (nth 2 dt) sunday) 0)
+		 ((= (nth 2 dt) sunday)
+		  (if (>= (nth 3 dt) (+ 3 bump)) -1 0))
+		 (t -1))))
+	((< (nth 1 dt) 10) -1)
+	((= (nth 1 dt) 10)
+	 (let ((sunday (math-prev-weekday-in-month date dt 31 0)))
+	   (cond ((< (nth 2 dt) sunday) -1)
+		 ((= (nth 2 dt) sunday)
+		  (if (>= (nth 3 dt) (+ 2 bump)) 0 -1))
+		 (t 0))))
+	(t 0)))
+
 ;;; Compute the day (1-31) of the WDAY (0-6) on or preceding the given
 ;;; day of the given month.
 (defun math-prev-weekday-in-month (date dt day wday)