aboutsummaryrefslogtreecommitdiff
path: root/module/vcomponent/recurrence/generate.scm
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@hornquist.se>2019-11-04 14:14:53 +0100
committerHugo Hörnquist <hugo@hornquist.se>2019-11-04 14:14:53 +0100
commit8be804ad5f9e91befa0d1d5738b242ebc368cf36 (patch)
treee5e2a9b6331bf79c83e692fdcbb22fd50582fef5 /module/vcomponent/recurrence/generate.scm
parentSet geiser scheme to guile in main. (diff)
downloadcalp-8be804ad5f9e91befa0d1d5738b242ebc368cf36.tar.gz
calp-8be804ad5f9e91befa0d1d5738b242ebc368cf36.tar.xz
Maybe fixed timezone?
Diffstat (limited to 'module/vcomponent/recurrence/generate.scm')
-rw-r--r--module/vcomponent/recurrence/generate.scm37
1 files changed, 37 insertions, 0 deletions
diff --git a/module/vcomponent/recurrence/generate.scm b/module/vcomponent/recurrence/generate.scm
index 3f4cb869..ea17b0e0 100644
--- a/module/vcomponent/recurrence/generate.scm
+++ b/module/vcomponent/recurrence/generate.scm
@@ -43,6 +43,41 @@
;; TODO My current naïve aproach to simple adding a constant time to an event
;; breaks with time-zones. betwen 12:00 two adjacent days might NOT be 24h.
;; Specifically, 23h or 25h when going between summer and "normal" time.
+
+(define (next-event ev r)
+ (let ((e (copy-vcomponent ev))
+ (tz (getenv "TZ")))
+ ;; (setenv "TZ" (car (prop (attr* e 'DTSTART) 'TZID)))
+ (aif (prop (attr* e 'DTSTART) 'TZID)
+ (setenv "TZ" (car it))
+ ;; Should missing be this, or explicitly GMT?
+ (unsetenv "TZ"))
+
+ (let ((d (time-utc->date (attr e 'DTSTART)))
+ (i (interval r)))
+ (case (freq r)
+ ((SECONDLY) (mod! (second d) = (+ i)))
+ ((MINUTELY) (mod! (minute d) = (+ i)))
+ ((HOURLY) (mod! (hour d) = (+ i)))
+ ((DAILY) (mod! (day d) = (+ i)))
+ ((WEEKLY) (mod! (day d) = (+ (* i 7))))
+ ((MONTHLY) (mod! (month d) = (+ i)))
+ ((YEARLY) (mod! (year d) = (+ i))))
+
+ (set! (zone-offset d)
+ (zone-offset (time-utc->date (date->time-utc d))))
+
+ (set! (attr e 'DTSTART) (date->time-utc d)))
+
+ (when (attr e 'DTEND)
+ (set! (attr e 'DTEND)
+ (add-duration (attr e 'DTSTART) (attr e 'DURATION))))
+
+ (setenv "TZ" tz)
+
+ e))
+
+#;
(define (next-event ev r)
(let* ((e (copy-vcomponent ev))
(d (time-utc->date
@@ -68,6 +103,8 @@
(date->time-utc d))
(when (prop (attr* e 'DTSTART) 'TZID)
+ ;; (list "Europe/Stockholm"), or similar
+ ;; (format (current-error-port) "TZID = ~a~%" (prop (attr* e 'DTSTART) 'TZID))
(let ((of (get-tz-offset e)))
;; This addition works, but we still get lunch at 13
(set! (zone-offset d) of)))