timable
This library provides a bundle of extended functions for racket’s various time/date libs.
source code: https://github.com/yanyingwang/timable
Since this lib is not very stable, I may change the interfaces along with my learning of racket lang, you’d better specify this pkg with the git commit id such as: https://github.com/yanyingwang/timable#a6c610de02336a0f0858e50ce5f016bd82b79b8a.
Check more at Package Sources.Please use gregor instead of srfi/19 if possible, since this lib is tightly sticking with gregor.
(require timable) is same as (require timable/gregor timable/convert).
1 Extended gregor
1.1 from base gregor
Procedures that extended from Gregor: Dates and Times.
(require timable/gregor) | package: timable |
> (require timable/gregor gregor) > (current-datetime) #<datetime 2025-04-01T17:12:16.057723145>
> (prev-day (now)) #<datetime 2025-03-31T17:12:16.064203125>
> (at-beginning/on-month (now)) #<datetime 2025-04-01T00:00:00>
> (parse/datetime "2018-02-14 12:30:45") #<datetime 2018-02-14T12:30:45>
procedure
(current-date) → date?
procedure
procedure
procedure
procedure
current-datetime is an alias procedure of now.
current-datetime/utc is an alias procedure of now/utc.
current-moment is an alias procedure of now/moment.
current-moment/utc is an alias procedure of now/moment/utc.
> (current-date) #<date 2025-04-01>
> (current-datetime) #<datetime 2025-04-01T17:12:16.526743408>
> (current-moment) #<moment 2025-04-01T17:12:16.528376221Z[UTC]>
> (current-moment/utc) #<moment 2025-04-01T17:12:16.530109131Z[Etc/UTC]>
procedure
n : integer?
procedure
(months-ago n) → datetime?
n : integer?
procedure
n : integer?
procedure
n : integer?
procedure
(years-ago/utc n) → datetime?
n : integer?
procedure
(months-ago/utc n) → datetime?
n : integer?
procedure
(days-ago/utc n) → datetime?
n : integer?
procedure
(hours-ago/utc n) → datetime?
n : integer?
> (now) #<datetime 2025-04-01T17:12:16.9658125>
> (hours-ago 1) #<datetime 2025-04-01T16:12:16.968292236>
> (months-ago 3) #<datetime 2025-01-01T17:12:16.970828613>
> (years-ago 1) #<datetime 2024-04-01T17:12:16.972705078>
> (hours-ago/utc 1) #<datetime 2025-04-01T16:12:16.975354492>
procedure
(years-from-now n) → datetime?
n : integer?
procedure
(days-from-now n) → datetime?
n : integer?
procedure
(hours-from-now n) → datetime?
n : integer?
procedure
(years-from-now/utc n) → datetime?
n : integer?
procedure
(days-from-now/utc n) → datetime?
n : integer?
procedure
(hours-from-now/utc n) → datetime?
n : integer?
> (now) #<datetime 2025-04-01T17:12:17.414658691>
> (hours-from-now 1) #<datetime 2025-04-01T18:12:17.417033691>
procedure
t : (or/c date? time? datetime? moment?)
procedure
t : (or/c date? time? datetime? moment?)
procedure
(prev-month t) → (or/c date? time? datetime? moment?)
t : (or/c date? time? datetime? moment?)
procedure
(next-month t) → (or/c date? time? datetime? moment?)
t : (or/c date? time? datetime? moment?)
procedure
t : (or/c date? time? datetime? moment?)
procedure
t : (or/c date? time? datetime? moment?)
procedure
(at-beginning/on-day t) → (or/c datetime? moment?)
t : (or/c date? datetime? moment?)
procedure
(at-end/on-day t) → (or/c datetime? moment?)
t : (or/c date? datetime? moment?)
procedure
(at-beginning/on-month t) → (or/c datetime? moment?)
t : (or/c date? datetime? moment?)
procedure
(at-end/on-month t) → (or/c date? datetime? moment?)
t : (or/c date? datetime? moment?)
procedure
(at-beginning/on-year t) → (date? or/c datetime? moment?)
t : (or/c date? datetime? moment?)
procedure
(at-end/on-year t) → (or/c date? datetime? moment?)
t : (or/c date? datetime? moment?)
> (now) #<datetime 2025-04-01T17:12:18.427212891>
> (at-beginning/on-day (now)) #<datetime 2025-04-01T00:00:00>
> (at-beginning/on-month (now)) #<datetime 2025-04-01T00:00:00>
> (at-end/on-month (now)) #<datetime 2025-04-30T23:59:59.999999999>
procedure
(->utc-offset/hours m) → number?
m : moment?
> (now/moment) #<moment 2025-04-01T17:12:18.900443359Z[UTC]>
> (->utc-offset/hours (now/moment)) 0
procedure
(parse/datetime str) → datetime?
str : string?
> (parse/datetime "2018-02-14 12:30:45") #<datetime 2018-02-14T12:30:45>
> (parse/datetime "2018/02-14 12-30 45") #<datetime 2018-02-14T12:30:45>
1.2 from converting between sql and gregor
Functions that converting between MySQL Types and Gregor: Dates and Times.
(require timable/convert) | package: timable |
> (require gregor) > (->sql-timestamp (today)) (sql-timestamp 2025 4 1 0 0 0 0 #f)
> (today/sql) (sql-date 2025 4 1)
procedure
d : date?
procedure
d : datetime?
procedure
d : moment?
procedure
d : (or/c date? datetime? moment?)
> (->sql-timestamp (today)) (sql-timestamp 2025 4 1 0 0 0 0 #f)
> (->sql-timestamp (now)) (sql-timestamp 2025 4 1 17 12 20 366682129 #f)
> (->sql-timestamp (now/moment)) (sql-timestamp 2025 4 1 17 12 20 371801025 0)
> (->sql-timestamp (now)) (sql-timestamp 2025 4 1 17 12 20 373794189 #f)
> (->sql-timestamp (now/moment #:tz "Asia/Shanghai")) (sql-timestamp 2025 4 2 1 12 20 375975586 8)
procedure
(now/sql d) → sql-timestamp?
d : moment?
procedure
(now/moment/sql d) → sql-timestamp?
d : moment?
procedure
d : date?
procedure
d : datetime?
procedure
d : moment?
procedure
(current-date/sql d) → sql-date?
d : date?
Use current-moment/sql as an alias of now/moment/sql to return now/moment in sql-timestamp-tz type.
Use current-date/sql as an alias of today/sql to return today in sql-date type.
> (today) #<date 2025-04-01>
> (today/sql) (sql-date 2025 4 1)
> (now/sql) (sql-timestamp 2025 4 1 17 12 20 876828613 #f)
> (now/moment/sql #:tz "Asia/Shanghai") (sql-timestamp 2025 4 1 17 12 20 878973389 0)
2 Extended srfi/19
Procedures that extended from SRFI 19: Time Data Types and Procedures.
(require timable/srfi) | package: timable |
> (require srfi/19) > (require timable/srfi) > (hours-ago 5) (date* 21 12 12 1 4 2025 2 90 #f 0 467000000 "")
> (time-in-range? (current-time) (hours-ago/time 1) (hours-from-now/time 1)) #t
> (last-oclock (current-date)) (date* 0 0 17 1 4 2025 2 90 #f 0 0 "")
> (last-oclock/time (current-time)) (tm:time 'time-utc 0 1743526800)
> (oclocks-between (hours-ago 2) (hours-ago 5))
(list
(date* 0 0 12 1 4 2025 2 90 #f 0 0 "")
(date* 0 0 13 1 4 2025 2 90 #f 0 0 "")
(date* 0 0 14 1 4 2025 2 90 #f 0 0 "")
(date* 0 0 15 1 4 2025 2 90 #f 0 0 ""))
> (oclocks-between/time (hours-ago/time 2) (hours-ago/time 5))
(list
(tm:time 'time-utc 0 1743508800)
(tm:time 'time-utc 0 1743512400)
(tm:time 'time-utc 0 1743516000)
(tm:time 'time-utc 0 1743519600))
> (beginning-date (current-date)) (date* 0 0 0 1 4 2025 2 90 #f 0 0 "")
> (beginning-date/month (current-date)) (date* 0 0 0 1 4 2025 2 90 #f 0 0 "")
> (beginning-date/year (current-date)) (date* 0 0 0 1 1 2025 3 0 #f 0 0 "")
> (date->string (date-parse "2018-01-01 11:11:11 +0800")) "Mon Jan 01 11:11:11+0800 2018"
> (date->string (date-parse "2018/01/01 12")) "Mon Jan 01 12:00:00Z 2018"
procedure
(hours-ago/time n) → time?
n : number?
procedure
(hours-ago/date n) → date?
n : number?
procedure
(hours-from-now n) → date?
n : number?
procedure
(hours-from-now/time n) → time?
n : number?
procedure
(hours-from-now/date n) → date?
n : number?
procedure
(time-in-range? time1 time2 time3) → boolean?
time1 : time? time2 : time? time3 : time?
procedure
(time-in-range<>? time1 time2 time3) → boolean?
time1 : time? time2 : time? time3 : time?
procedure
(time-in-range==? time1 time2 time3) → boolean?
time1 : time? time2 : time? time3 : time?
procedure
(time-in-range=<>=? time1 time2 time3) → boolean?
time1 : time? time2 : time? time3 : time?
procedure
(time-in-range=<>? time1 time2 time3) → boolean?
time1 : time? time2 : time? time3 : time?
procedure
(time-in-range<>=? time1 time2 time3) → boolean?
time1 : time? time2 : time? time3 : time?
procedure
(beginning-date d) → date?
d : date?
procedure
(beginning-date/day d) → date?
d : date?
procedure
(beginning-date/month d) → date?
d : date?
procedure
(beginning-date/year d) → date?
d : date?
procedure
(end-date d) → date?
d : date?
procedure
(end-date/day d) → date?
d : date?
procedure
(end-date/month d) → date?
d : date?
procedure
(end-date/year d) → date?
d : date?
procedure
(previous-date/day d) → date?
d : date?
procedure
(date-parse str) → date?
str : string?
procedure
(previous-date/month d) → date?
d : date?
procedure
(last-oclock/time d) → time?
d : time?
procedure
(last-oclock/date d) → date?
d : date?
procedure
(last-oclock d) → date?
d : date?
procedure
(oclocks-between d1 d2) → list?
d1 : date? d2 : date?
procedure
(oclocks-between/time t1 t2) → list?
t1 : time? t2 : time?
procedure
(oclocks-between/date d1 d2) → list?
d1 : date? d2 : date?
procedure
(time-utc->date->string t [format-string]) → string?
t : time? format-string : string? = "~c"
procedure
(time-utc->string t [format-string]) → string?
t : time? format-string : string? = "~c"
3 Change Logs
at-end/on-month. –2020/02/04
enh docs for gregor. –2020/02/03
version 0.2.0
add parse/datetime to gregor lib. –2019/12/16
add now/sql now/moment/sql today/sql ... to convert lib.
rename timeless to timable and add support to gregor and sql-timestamp.
splited from chive and name it to timeless only support srfi/19 lib.
refactor chive from chez scheme version to racket.