From 477302d490adf3e7c4c1d772aaba7dbdd454b60a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 29 May 2022 13:07:50 -0700 Subject: [PATCH 2/3] =?UTF-8?q?ISO=208601=20strings=20sans=20"Z"=20don?= =?UTF-8?q?=E2=80=99t=20specify=20DST=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 | 12 +++++++++--- test/lisp/calendar/iso8601-tests.el | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/lisp/calendar/iso8601.el b/lisp/calendar/iso8601.el index e31120f52f..6827a957a6 100644 --- a/lisp/calendar/iso8601.el +++ b/lisp/calendar/iso8601.el @@ -114,6 +114,11 @@ iso8601--duration-match 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 @@ iso8601-parse (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 @@ iso8601-parse-time (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 @@ iso8601--value (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 @@ iso8601--decoded-time (iso8601--value month) (iso8601--value year) nil - (if (or dst zone) dst -1) + dst zone)) (defun iso8601--encode-time (time) diff --git a/test/lisp/calendar/iso8601-tests.el b/test/lisp/calendar/iso8601-tests.el index 6c9e85ec92..f64c498c02 100644 --- a/test/lisp/calendar/iso8601-tests.el +++ b/test/lisp/calendar/iso8601-tests.el @@ -82,9 +82,9 @@ test-iso8601-combined (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") @@ -221,24 +221,24 @@ standard-test-time-of-day-utc (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) -- 2.34.1