From bd46723a27e0a17de50d063336c6043e4ed3027f Mon Sep 17 00:00:00 2001 From: Sylvain Chouleur Date: Mon, 10 Nov 2014 09:07:09 -0800 Subject: [PATCH] Allow VTIMEZONE where daylight and standard time zones are equal. See: http://lists.gnu.org/archive/html/emacs-devel/2014-11/msg00494.html * calendar/icalendar.el (icalendar--convert-tz-offset): Support timezone without daylight saving time. --- lisp/ChangeLog | 7 ++++++ lisp/calendar/icalendar.el | 53 ++++++++++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c170c50c9f8..97fea44fb44 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2014-11-10 Sylvain Chouleur (tiny change) + + Allow VTIMEZONE where daylight and standard time zones are equal. + See: http://lists.gnu.org/archive/html/emacs-devel/2014-11/msg00494.html + * calendar/icalendar.el (icalendar--convert-tz-offset): + Support timezone without daylight saving time. + 2014-11-10 Glenn Morris * startup.el (command-line): Handle nil elements in load-path. diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el index 5f89318e139..b024a38f809 100644 --- a/lisp/calendar/icalendar.el +++ b/lisp/calendar/icalendar.el @@ -485,45 +485,48 @@ children." ALIST is an alist entry from a VTIMEZONE, like STANDARD. DST-P is non-nil if this is for daylight savings time. The strings are suitable for assembling into a TZ variable." - (let ((offset (car (cddr (assq 'TZOFFSETTO alist)))) - (rrule-value (car (cddr (assq 'RRULE alist)))) - (dtstart (car (cddr (assq 'DTSTART alist))))) + (let* ((offsetto (car (cddr (assq 'TZOFFSETTO alist)))) + (offsetfrom (car (cddr (assq 'TZOFFSETFROM alist)))) + (rrule-value (car (cddr (assq 'RRULE alist)))) + (dtstart (car (cddr (assq 'DTSTART alist)))) + (no-dst (equal offsetto offsetfrom))) ;; FIXME: for now we only handle RRULE and not RDATE here. - (when (and offset rrule-value dtstart) + (when (and offsetto dtstart (or rrule-value no-dst)) (let* ((rrule (icalendar--split-value rrule-value)) (freq (cadr (assq 'FREQ rrule))) (bymonth (cadr (assq 'BYMONTH rrule))) (byday (cadr (assq 'BYDAY rrule)))) ;; FIXME: we don't correctly handle WKST here. - (if (and (string= freq "YEARLY") bymonth) + (if (or no-dst (and (string= freq "YEARLY") bymonth)) (cons (concat ;; Fake a name. (if dst-p "DST" "STD") ;; For TZ, OFFSET is added to the local time. So, ;; invert the values. - (if (eq (aref offset 0) ?-) "+" "-") - (substring offset 1 3) + (if (eq (aref offsetto 0) ?-) "+" "-") + (substring offsetto 1 3) ":" - (substring offset 3 5)) + (substring offsetto 3 5)) ;; The start time. - (let* ((day (icalendar--get-weekday-number (substring byday -2))) - (week (if (eq day -1) - byday - (substring byday 0 -2)))) - ;; "Translate" the iCalendar way to specify the last - ;; (sun|mon|...)day in month to the tzset way. - (if (string= week "-1") ; last day as iCalendar calls it - (setq week "5")) ; last day as tzset calls it - (concat "M" bymonth "." week "." (if (eq day -1) "0" - (int-to-string day)) - ;; Start time. - "/" - (substring dtstart -6 -4) - ":" - (substring dtstart -4 -2) - ":" - (substring dtstart -2))))))))) + (unless no-dst + (let* ((day (icalendar--get-weekday-number (substring byday -2))) + (week (if (eq day -1) + byday + (substring byday 0 -2)))) + ;; "Translate" the iCalendar way to specify the last + ;; (sun|mon|...)day in month to the tzset way. + (if (string= week "-1") ; last day as iCalendar calls it + (setq week "5")) ; last day as tzset calls it + (concat "M" bymonth "." week "." (if (eq day -1) "0" + (int-to-string day)) + ;; Start time. + "/" + (substring dtstart -6 -4) + ":" + (substring dtstart -4 -2) + ":" + (substring dtstart -2)))))))))) (defun icalendar--parse-vtimezone (alist) "Turn a VTIMEZONE ALIST into a cons (ID . TZ-STRING). -- 2.11.4.GIT