diff --git a/collects/plot/common/date-time.rkt b/collects/plot/common/date-time.rkt index 93f429faf9..97ae40dcf1 100644 --- a/collects/plot/common/date-time.rkt +++ b/collects/plot/common/date-time.rkt @@ -21,12 +21,6 @@ ;; A date is always represented by the number of seconds since the platform-specific, UTC epoch -(define (date*->seconds dt [local-time? #t]) - (match-define (date* s mn h d m y wd yd dst? tz ns tz-name) - dt) - (+ (date->seconds (date s mn h d m y wd yd dst? tz) local-time?) - (/ ns 1000000000))) - (define (date*->utc-seconds dt) (- (date*->seconds dt #f) (date-time-zone-offset dt))) diff --git a/collects/racket/date.rkt b/collects/racket/date.rkt index 49f7e79a11..18d164b410 100644 --- a/collects/racket/date.rkt +++ b/collects/racket/date.rkt @@ -6,8 +6,9 @@ racket/contract/base) (provide/contract - [current-date (-> date?)] + [current-date (-> date*?)] [date->seconds ((date?) (any/c) . ->* . exact-integer?)] + [date*->seconds ((date?) (any/c) . ->* . real?)] [date->string ((date?) (any/c) . ->* . string?)] [date-display-format (parameter/c (symbols 'american 'chinese 'german 'indian 'irish 'julian 'iso-8601 'rfc2822))] [find-seconds (((integer-in 0 61) @@ -23,7 +24,7 @@ [julian/scalinger->string (exact-integer? . -> . string?)]) (define (current-date) - (seconds->date (current-seconds))) + (seconds->date (* #i1/1000 (current-inexact-milliseconds)))) ;; Support for Julian calendar added by Shriram; ;; current version only works until 2099 CE Gregorian @@ -263,6 +264,12 @@ (date-year date) local-time?)) +(define (date*->seconds date [local-time? #t]) + (define s (date->seconds date local-time?)) + (if (date*? date) + (+ s (/ (date*-nanosecond date) 1000000)) + s)) + (define (find-seconds sec min hour day month year [local-time? #t]) (define (signal-error msg) (error 'find-secs (string-append diff --git a/collects/scribblings/reference/time.scrbl b/collects/scribblings/reference/time.scrbl index 49dff56ae2..5f3eb4ab00 100644 --- a/collects/scribblings/reference/time.scrbl +++ b/collects/scribblings/reference/time.scrbl @@ -154,7 +154,7 @@ result is the result of the last @racket[body].} @defproc[(current-date) date*?]{ -An abbreviation for @racket[(seconds->date (current-seconds))].} +An abbreviation for @racket[(seconds->date (* 0.001 (current-inexact-milliseconds)))].} @defproc[(date->string [date date?] [time? any/c #f]) string?]{ @@ -175,12 +175,19 @@ Parameter that determines the date string format. The initial format is @racket['american].} @defproc[(date->seconds [date date?] [local-time? any/c #t]) exact-integer?]{ -Finds the representation of a date in platform-specific seconds. -The @racket[time-zone-offset] field of @racket[date] is ignored; -the date is assumed to be in local time by default or in UTC -if @racket[local-time?] is @racket[#f]. If -the platform cannot represent the specified date, an error is -signaled, otherwise an integer is returned. } +Finds the representation of a date in platform-specific seconds. +If the platform cannot represent the specified date, +@exnraise[exn:fail]. + +The @racket[week-day], @racket[year-day] fields of @racket[date] are +ignored. The @racket[dst?] and @racket[time-zone-offset] fields of +@racket[date] are also ignored; the date is assumed to be in local +time by default or in UTC if @racket[local-time?] is @racket[#f].} + +@defproc[(date*->seconds [date date?] [local-time? any/c #t]) real?]{ +Like @racket[date->seconds], but returns an exact number that can +include a fraction of a second based on @racket[(date*-nanosecond +date)] if @racket[date] is a @racket[date*] instance.} @defproc[(find-seconds [second (integer-in 0 61)] [minute (integer-in 0 59)] diff --git a/collects/tests/racket/date.rktl b/collects/tests/racket/date.rktl index ed011e389f..cc17fd71ea 100644 --- a/collects/tests/racket/date.rktl +++ b/collects/tests/racket/date.rktl @@ -3,7 +3,7 @@ (Section 'date) -(require mzlib/date) +(require racket/date) (test #t date? (date* 0 0 0 1 1 -3000 0 0 #f -1000 0 "AST")) (test #t date? (date* 60 59 23 31 12 3000 6 365 #t 1000 999999999 "ZST")) @@ -38,12 +38,21 @@ (let* ([secs (find-seconds 1 2 3 4 5 2006)] [d-some-tz (seconds->date secs)] [d (struct-copy date d-some-tz - [time-zone-offset -21600])]) + [time-zone-offset -21600])] + [d* (date* (date-second d) (date-minute d) (date-hour d) + (date-day d) (date-month d) (date-year d) + (date-week-day d) (date-year-day d) (date-dst? d) + (date-time-zone-offset d) + 62500 + "MDT")]) (define (test-string fmt time? result) (test (parameterize ([date-display-format fmt]) (date->string d time?)) fmt result)) (test secs date->seconds d) + (test secs date*->seconds d) + (test (+ secs #e0.0625) date*->seconds d*) + (test (date->seconds d*) date->seconds (seconds->date (date*->seconds d*))) (test-string 'american #f "Thursday, May 4th, 2006") (test-string 'american #t "Thursday, May 4th, 2006 3:02:01am") diff --git a/doc/release-notes/racket/HISTORY.txt b/doc/release-notes/racket/HISTORY.txt index 7970a487a3..c2bb553203 100644 --- a/doc/release-notes/racket/HISTORY.txt +++ b/doc/release-notes/racket/HISTORY.txt @@ -2,6 +2,8 @@ Version 5.3.2.2 Added extflonums racket/extflonum: added racket/unsafe/ops: added extflonum operations +racket/date: changed current-date to provide nanoseconds, + added date*->seconds Version 5.3.2.2 Added file-truncate