From d4a88d0e39105724232ce3576328a552035511e7 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sat, 14 Nov 2009 21:10:54 -0600 Subject: [PATCH] add unix-time>timestamp, timestamp>unix-time, and some utility words to calendar --- basis/calendar/calendar-tests.factor | 5 +++++ basis/calendar/calendar.factor | 30 +++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/basis/calendar/calendar-tests.factor b/basis/calendar/calendar-tests.factor index 8d1071122d..44ba777c45 100644 --- a/basis/calendar/calendar-tests.factor +++ b/basis/calendar/calendar-tests.factor @@ -170,3 +170,8 @@ IN: calendar.tests [ f ] [ now dup midnight eq? ] unit-test [ f ] [ now dup easter eq? ] unit-test [ f ] [ now dup beginning-of-year eq? ] unit-test + +[ t ] [ 1325376000 unix-time>timestamp 2012 = ] unit-test +[ t ] [ 1356998399 unix-time>timestamp 2013 1 seconds time- = ] unit-test + +[ t ] [ 1500000000 random [ unix-time>timestamp timestamp>unix-time ] keep = ] unit-test diff --git a/basis/calendar/calendar.factor b/basis/calendar/calendar.factor index e784398baf..ef22a98c80 100644 --- a/basis/calendar/calendar.factor +++ b/basis/calendar/calendar.factor @@ -17,6 +17,8 @@ TUPLE: duration C: duration +: instant ( -- duration ) 0 0 0 0 0 0 ; + TUPLE: timestamp { year integer } { month integer } @@ -34,6 +36,15 @@ C: timestamp : ( year month day -- timestamp ) 0 0 0 gmt-offset-duration ; +: ( year month day -- timestamp ) + 0 0 0 instant ; + +: ( year -- timestamp ) + 1 1 ; + +: ( year -- timestamp ) + 1 1 ; + ERROR: not-a-month ; M: not-a-month summary drop "Months are indexed starting at 1" ; @@ -149,7 +160,6 @@ M: timestamp easter ( timestamp -- timestamp ) : >time< ( timestamp -- hour minute second ) [ hour>> ] [ minute>> ] [ second>> ] tri ; -: instant ( -- duration ) 0 0 0 0 0 0 ; : years ( x -- duration ) instant clone swap >>year ; : months ( x -- duration ) instant clone swap >>month ; : days ( x -- duration ) instant clone swap >>day ; @@ -430,6 +440,9 @@ M: timestamp day-name day-of-week day-names nth ; : beginning-of-month ( timestamp -- new-timestamp ) midnight 1 >>day ; +: end-of-month ( timestamp -- new-timestamp ) + [ midnight ] [ days-in-month ] bi >>day ; + >month ; : beginning-of-week ( timestamp -- new-timestamp ) midnight sunday ; -: beginning-of-year ( timestamp -- new-timestamp ) - beginning-of-month 1 >>month ; +GENERIC: beginning-of-year ( object -- new-timestamp ) +M: timestamp beginning-of-year beginning-of-month 1 >>month ; +M: integer beginning-of-year ; + +GENERIC: end-of-year ( object -- new-timestamp ) +M: timestamp end-of-year 12 >>month 31 >>day ; +M: integer end-of-year 12 31 ; : time-since-midnight ( timestamp -- duration ) dup midnight time- ; @@ -531,6 +549,12 @@ M: timestamp december clone 12 >>month ; : since-1970 ( duration -- timestamp ) unix-1970 time+ >local-time ; +: timestamp>unix-time ( timestamp -- seconds ) + unix-1970 time- second>> ; + +: unix-time>timestamp ( seconds -- timestamp ) + seconds unix-1970 time+ ; + M: timestamp sleep-until timestamp>micros sleep-until ; M: duration sleep hence sleep-until ;