]> git.eshelyaron.com Git - emacs.git/commitdiff
ISO 8601 strings sans "Z" don’t specify DST flag
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 29 May 2022 20:07:50 +0000 (13:07 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 29 May 2022 22:01:55 +0000 (15:01 -0700)
* lisp/calendar/iso8601.el (iso8601--zone-dst): New function.
(iso8601-parse, iso8601-parse-time): Use it.
(iso8601--decoded-time): Default dst to -1, not nil.
* test/lisp/calendar/iso8601-tests.el (test-iso8601-combined)
(standard-test-time-of-day-zone): Adjust to new behavior.

lisp/calendar/iso8601.el
test/lisp/calendar/iso8601-tests.el

index e31120f52ff63fcc738dc3dd43944a2f4b77f645..6827a957a6f7e3200e41b5fff69a46083226d17f 100644 (file)
          iso8601--duration-week-match
          iso8601--duration-combined-match)))
 
+;; "Z" dnd "z" are standard time; nil and [-+][0-9][0-9]... are local time
+;; with unknown DST.
+(defun iso8601--zone-dst (zone)
+  (if (= (length zone) 1) nil -1))
+
 (defun iso8601-parse (string &optional form)
   "Parse an ISO 8601 date/time string and return a `decode-time' structure.
 
@@ -140,7 +145,7 @@ See `decode-time' for the meaning of FORM."
         (setf (decoded-time-zone date)
               ;; The time zone in decoded times are in seconds.
              (* (iso8601-parse-zone zone-string) 60))
-       (setf (decoded-time-dst date) nil))
+       (setf (decoded-time-dst date) (iso8601--zone-dst zone-string)))
       date)))
 
 (defun iso8601-parse-date (string)
@@ -256,6 +261,7 @@ See `decode-time' for the meaning of FORM."
           (iso8601--decoded-time :hour hour
                                  :minute (or minute 0)
                                  :second (or second 0)
+                                :dst (iso8601--zone-dst zone)
                                  :zone (and zone
                                             (* 60 (iso8601-parse-zone
                                                    zone)))))))))
@@ -364,7 +370,7 @@ Return the number of minutes."
 
 (cl-defun iso8601--decoded-time (&key second minute hour
                                       day month year
-                                      dst zone)
+                                     (dst -1) zone)
   (list (iso8601--value second)
         (iso8601--value minute)
         (iso8601--value hour)
@@ -372,7 +378,7 @@ Return the number of minutes."
         (iso8601--value month)
         (iso8601--value year)
         nil
-       (if (or dst zone) dst -1)
+       dst
         zone))
 
 (defun iso8601--encode-time (time)
index 6c9e85ec92045374c6a5422f80268fde02ce722c..f64c498c0278aa389a8e6597cd5b31f3f160946c 100644 (file)
@@ -82,9 +82,9 @@
   (should (equal (iso8601-parse "2008-03-02T13:47:30Z")
                  '(30 47 13 2 3 2008 nil nil 0)))
   (should (equal (iso8601-parse "2008-03-02T13:47:30+01:00")
-                 '(30 47 13 2 3 2008 nil nil 3600)))
+                 '(30 47 13 2 3 2008 nil -1 3600)))
   (should (equal (iso8601-parse "2008-03-02T13:47:30-01")
-                 '(30 47 13 2 3 2008 nil nil -3600))))
+                 '(30 47 13 2 3 2008 nil -1 -3600))))
 
 (ert-deftest test-iso8601-duration ()
   (should (equal (iso8601-parse-duration "P3Y6M4DT12H30M5S")
 
 (ert-deftest standard-test-time-of-day-zone ()
   (should (equal (iso8601-parse-time "152746+0100")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
   (should (equal (iso8601-parse-time "15:27:46+0100")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
 
   (should (equal (iso8601-parse-time "152746+01")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
   (should (equal (iso8601-parse-time "15:27:46+01")
-                 '(46 27 15 nil nil nil nil nil 3600)))
+                 '(46 27 15 nil nil nil nil -1 3600)))
 
   (should (equal (iso8601-parse-time "152746-0500")
-                 '(46 27 15 nil nil nil nil nil -18000)))
+                 '(46 27 15 nil nil nil nil -1 -18000)))
   (should (equal (iso8601-parse-time "15:27:46-0500")
-                 '(46 27 15 nil nil nil nil nil -18000)))
+                 '(46 27 15 nil nil nil nil -1 -18000)))
 
   (should (equal (iso8601-parse-time "152746-05")
-                 '(46 27 15 nil nil nil nil nil -18000)))
+                 '(46 27 15 nil nil nil nil -1 -18000)))
   (should (equal (iso8601-parse-time "15:27:46-05")
-                 '(46 27 15 nil nil nil nil nil -18000))))
+                 '(46 27 15 nil nil nil nil -1 -18000))))
 
 
 (defun test-iso8601-format-time-string-zone-round-trip (offset-minutes z-format)