(define-module (vcomponent datetime) #:use-module (vcomponent base) #:use-module (datetime) #:use-module (datetime util) #:use-module (util) #:export (#;parse-datetime event-overlaps? overlapping? event-contains? ev-timedate dtime (case (string-length dtime) ((8) "~Y~m~d") ; All day ((15) "~Y~m~dT~H~M~S") ; "local" or TZID-param ((16) "~Y~m~dT~H~M~S~z")))) ; UTC-time (define (event-overlaps? event begin end) "Returns if the event overlaps the timespan. Event must have the DTSTART and DTEND attribute set." (timespan-overlaps? (attr event 'DTSTART) (attr event 'DTEND) begin end)) (define (overlapping? event-a event-b) (timespan-overlaps? (attr event-a 'DTSTART) (attr event-a 'DTEND) (attr event-b 'DTSTART) (attr event-b 'DTEND))) (define (event-contains? ev date/-time) "Does event overlap the date that contains time." (let* ((start (as-date date/-time)) (end (add-day start))) (event-overlaps? ev start end))) (define-public (ev-time 2 elements (cond [(and (date= (as-date (attr e 'DTSTART)) (as-date (attr e 'DTEND))) (date= (as-date (attr e 'DTSTART)) date)) (time- (as-time (attr e 'DTEND)) (as-time (attr e 'DTSTART)))] ;; Starts today, end in future day [(date= (as-date (attr e 'DTSTART)) date) (time- #24:00:00 (as-time (attr e 'DTSTART)))] ;; Ends today, start earlier day [(date= (as-date (attr e 'DTEND)) date) (as-time (attr e 'DTEND))] ;; start earlier date, end later date [else #24:00:00])) ;; 22:00 - 03:00 ;; 2h för dag 1 ;; 3h för dag 2 ;; An event is considered long if it's DTSTART (and thereby DTEND) lacks a time component, ;; or if the total length of the event is greater than 24h. ;; For practical purposes, an event being long means that it shouldn't be rendered as a part ;; of a regular day. (define-public (long-event? ev) (or (date? (attr ev 'DTSTART)) (datetime<= (datetime date: (date day: 1)) (datetime-difference (attr ev 'DTEND) (attr ev 'DTSTART)))))