diff options
author | Sylvain Chouleur <sylvain.chouleur@gmail.com> | 2014-11-10 09:07:09 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-11-10 09:07:09 -0800 |
commit | bd46723a27e0a17de50d063336c6043e4ed3027f (patch) | |
tree | 8cacd7d65ae31bb4202fc87f773792c536bfde94 /lisp/calendar/icalendar.el | |
parent | 0121d32af5f58b284815da9c571f829f0f9e9186 (diff) | |
download | emacs-bd46723a27e0a17de50d063336c6043e4ed3027f.tar.gz |
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.
Diffstat (limited to 'lisp/calendar/icalendar.el')
-rw-r--r-- | lisp/calendar/icalendar.el | 53 |
1 files changed, 28 insertions, 25 deletions
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). |