summaryrefslogtreecommitdiff
path: root/ss/dates.scm
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2025-10-07 15:15:58 +0200
committerEkaitz Zarraga <ekaitz@elenq.tech>2025-10-07 15:15:58 +0200
commita1ed7b9f9954618e2ed4e14dd2dd3215ba7afd7d (patch)
tree5ce01882fb28f786ce6c362cb51d8809d641284c /ss/dates.scm
parent656bca99b0b4c7130855cb01b30b944d4dcb4d12 (diff)
API: move `src` to `ss`
Diffstat (limited to 'ss/dates.scm')
-rw-r--r--ss/dates.scm44
1 files changed, 44 insertions, 0 deletions
diff --git a/ss/dates.scm b/ss/dates.scm
new file mode 100644
index 0000000..58a1ec6
--- /dev/null
+++ b/ss/dates.scm
@@ -0,0 +1,44 @@
+(define-module (ss 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))