(require (lib "trace.ss")) (define (skuddår? år) (cond ((= (remainder år 4) 0) (cond ((= (remainder år 100) 0) (cond ((= (remainder år 400) 0) #t) (else #f))) (else #t))) (else #f))) (define (tell-skuddår fra til) (cond ((= fra til) (if (skuddår? fra) 1 0)) ((< fra til) (+ (if (skuddår? fra) 1 0) (tell-skuddår (+ fra 1) til))) (else 0))) (define (månedslengde år måned) (cond ((or (= måned 4) (= måned 6) (= måned 9) (= måned 11)) 30) ((= måned 2) (if (skuddår? år) 29 28)) (else 31))) (define (beregn-dato år måned dagnum) (if (<= dagnum (månedslengde år måned)) (list år måned dagnum) (beregn-dato år (+ måned 1) (- dagnum (månedslengde år måned))))) (define (dager-i-år år) (if (skuddår? år) 366 365)) (define (sekunder->dato sekunder) (let* ((startår 1970) (dager/år 365) (sekunder/dag 86400) (dager (quotient sekunder sekunder/dag)) (standardår (quotient dager dager/år)) (restdager (remainder dager dager/år)) (skudd (tell-skuddår startår (+ startår standardår -1))) (antall-år (if (< restdager skudd) (- standardår (+ 1 (quotient (- skudd restdager) dager/år))) standardår)) (dette-år (+ startår antall-år)) (dag-i-året (+ 1 (if (< restdager skudd) (- (if (skuddår? dette-år) (+ dager/år 1) dager/år) (remainder (- skudd restdager) dager/år)) (- restdager skudd))))) (beregn-dato dette-år 1 dag-i-året))) (define des-31-2003 1072915199) ; 31.12.2003, kl. 23:59:59 (define jan-01-2004 1072915200) ; 01.01.2004, kl. 00:00:00 (define feb-29-2004 1078012800) ; 29.02.2004, kl. 00:00:00 (define mar-01-2004 1078099200) ; 01.03.2004, kl. 00:00:00 (define des-22-2004 1103673600) ; 22.12.2004, kl. 00:00:00 (define des-23-2004 1103760000) ; 23.12.2004, kl. 00:00:00 (define des-31-2004 1104537599) ; 31.12.2004, kl. 23:59:59 (define jan-01-2005 1104537600) ; 01.01.2005, kl. 00:00:00 (define jan-11-2005 1105451104) ; 11.01.2005, kl. 14.45.04 (define (test) (display (sekunder->dato 0))(newline) (display (sekunder->dato des-31-2003))(newline) (display (sekunder->dato jan-01-2004))(newline) (display (sekunder->dato feb-29-2004))(newline) (display (sekunder->dato mar-01-2004))(newline) (display (sekunder->dato des-22-2004))(newline) (display (sekunder->dato des-23-2004))(newline) (display (sekunder->dato des-31-2004))(newline) (display (sekunder->dato jan-01-2005))(newline) (display (sekunder->dato jan-11-2005))(newline) (display (sekunder->dato (current-seconds)))(newline))