summaryrefslogtreecommitdiff
path: root/lisp/calendar/icalendar.el
diff options
context:
space:
mode:
authorSylvain Chouleur <sylvain.chouleur@gmail.com>2014-11-10 09:07:09 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2014-11-10 09:07:09 -0800
commitbd46723a27e0a17de50d063336c6043e4ed3027f (patch)
tree8cacd7d65ae31bb4202fc87f773792c536bfde94 /lisp/calendar/icalendar.el
parent0121d32af5f58b284815da9c571f829f0f9e9186 (diff)
downloademacs-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.el53
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).