(define-module (datetime) ;; To resolve colision with cadr-second from srfi-1 :replace (second) :use-module (srfi srfi-1) :use-module (srfi srfi-9) :use-module (srfi srfi-9 gnu) :use-module (srfi srfi-41) :use-module (srfi srfi-71) :use-module (srfi srfi-88) :use-module ((hnh util) :select ( vector-last -> ->> swap set label span-upto set-> )) :use-module (ice-9 i18n) :use-module (ice-9 format) :use-module (ice-9 regex) :use-module (ice-9 match) :use-module (calp util config) :export (date date? year month day time time? hour minute second datetime datetime? get-date get-timezone date-zero? time-zero? datetime->unix-time unix-time->datetime current-datetime current-date get-datetime as-date as-time as-datetime leap-year? days-in-month days-in-year start-of-month end-of-month start-of-year date-stream day-stream month-stream week-stream time-min time-max date-min date-max datetime-min datetime-max week-day week-1-start week-number date-starting-week week-day-name timespan-overlaps? find-first-week-day all-wday-in-month all-wday-in-year in-date-range? weekday-list start-of-week end-of-week month-days days-in-interval year-day time->decimal-hour datetime->decimal-hour date-range datetime->string date->string time->string parse-month string->datetime string->time string->date string->date/-time parse-ics-date parse-ics-time parse-ics-datetime parse-iso-date parse-iso-time parse-iso-datetime parse-freeform-date date= date=? time= time=? datetime= datetime=? date< date date>? date>= date>=? time< time time>? time>= time>=? datetime< datetime datetime>? datetime>= datetime>=? date/-time< date/-time date/-time>? date/-time>= date/-time>=? date+ date- time+ time- datetime+ datetime- date-difference datetime-difference ) :re-export (locale-month locale-month-short)) ;;; Enums (define-public jan 1) (define-public january 1) (define-public feb 2) (define-public february 2) (define-public mar 3) (define-public mars 3) (define-public apr 4) (define-public april 4) (define-public may 5) (define-public jun 6) (define-public june 6) (define-public jul 7) (define-public july 7) (define-public aug 8) (define-public august 8) (define-public sep 9) (define-public september 9) (define-public oct 10) (define-public october 10) (define-public nov 11) (define-public november 11) (define-public dec 12) (define-public december 12) (define-public sun 0) (define-public sunday 0) (define-public mon 1) (define-public monday 1) (define-public tue 2) (define-public tuesday 2) (define-public wed 3) (define-public wednesday 3) (define-public thu 4) (define-public thursday 4) (define-public fri 5) (define-public friday 5) (define-public sat 6) (define-public saturday 6) ;;; Configuration ;; (define-public week-start (make-parameter sun)) (define-config week-start sun description: "First day of week" pre: (ensure (lambda (x) (<= sun x sat)))) ;;; RECORD TYPES ;;; DATE (define-immutable-record-type (make-date year month day) date? (year year) (month month) (day day)) (define* (date key: (year 0) (month 0) (day 0)) (unless (and (integer? year) (integer? month) (integer? day)) (scm-error 'wrong-type-arg "date" "Year, month, and day must all be integers. ~s, ~s, ~s" (list year month day) #f)) (make-date year month day)) (set-record-type-printer! (lambda (r p) (display (date->string r "#~1") p))) ;;; TIME (define-immutable-record-type