On Mar 11, 2014, at 12:32 PM, Ismael Figueroa <ifiguer...@gmail.com> wrote:
> Working with a custom handin-server, I have a date value which represents a > deadline, but I also want to allow late submission up to 3 days later than > that (well, an arbitrary number of days). Hence, I need to check whether the > current date is at most 3 days later than the first one. > > In the configuration file I read a custom entry for the deadline, indicating > year, month, day, hours, minutes and seconds. Then I guess I could do: > > (define d (seconds->date (find-seconds seconds minutes hours day month > year))) > (define d+1 (seconds->date (find-seconds seconds minutes hours (+ day 1) > month year)) > (define d+2 (seconds->date (find-seconds seconds minutes hours (+ day 2) > month year)) > (define d+3 (seconds->date (find-seconds seconds minutes hours (+ day 3) > month year)) > > And then do a comparison, like > > (let ([now (current-seconds)]) > (or (> now (date->seconds d)) (> now (date->seconds d+1) ...)) > > But this looks too low level to me, and surprisingly the utilities provided > by racket/date are somewhat sparse. > > Does anyone know about a higher-level library for manipulating dates, and > performing arithmetic comparisons and operations? Dates are harder than they look. In this case, for instance, I think it would be a bad idea to add to the “day” without checking that the result is a legal date. However, in this (and many other) instance(s), it seems like you can get nearly everything you want simply by holding off on the “seconds->date” call. #lang racket (define DAY-SECONDS 86400) ;; ALL DATES IN SECONDS: (define d (find-seconds seconds minutes hours day month year)) (define d+1 (+ d (* 1 DAY-SECONDS))) (define d+2 (+ d (* 2 DAY-SECONDS))) (define d+3 (+ d (* 3 DAY-SECONDS))) ;;And then do a comparison, like (let ([now (current-seconds)]) (cond [(< now d) "on time!"] [(< now d+1) "one day late!"] [(< now d+2) "two days late!"])) ____________________ Racket Users list: http://lists.racket-lang.org/users