(define-module (src dates) #:use-module (ice-9 format) #:use-module (srfi srfi-1) #:use-module (srfi srfi-19) #:export (string/ISO->date date->string/RFC3339 unix-date newest find-newest date>?)) (define (string/ISO->date string) (string->date string "~Y-~m-~d")) (define (date->string/RFC3339 date) (call-with-output-string (lambda (p) (let* ((offset (abs (date-zone-offset date))) (rem-h-seconds (modulo offset (* 60 60))) (offset-hours (floor (/ (- offset rem-h-seconds) 60 60))) (rem-m-seconds (modulo rem-h-seconds 60)) (offset-minutes (floor (/ (- rem-h-seconds rem-m-seconds) 60)))) (format p "~4,'0d-~2,'0d-~2,'0dT~2,'0d:~2,'0d:~2,'0d~:[Z~;~c~2,'0d:~2,'0d~]" (date-year date) (date-month date) (date-day date) (date-hour date) (date-minute date) (date-second date) (not (= 0 (date-zone-offset date))) (if (< 0 (date-zone-offset date)) #\+ #\-) offset-hours offset-minutes))))) (define unix-date (string/ISO->date "1970-01-01")) (define (newest a b) (if (time>? (date->time-utc a) (date->time-utc b)) a b)) (define (date>? a b) (time>? (date->time-utc a) (date->time-utc b))) (define (find-newest dates) (reduce newest unix-date dates))