球拍中是否有内置功能来比较2个日期?
如果没有,任何人都可以告诉我如何编写一个函数来比较球拍中的2个日期。我是函数式编程语言的新手,请帮助。
答案 0 :(得分:3)
要检查两个对象是否属于同一类型并且看起来相同,请使用equal?
。 Scheme和Racket(语言)的时间不同。 Scheme具有SRFI-19,而Racket有date object
#!r6rs
(import (rnrs base)
(srfi :19))
(equal? (make-time time-utc 0 123)
(make-time time-utc 0 123))
; ==> #t
// perhaps faster equality test (not guaranteed to be faster)
(time=? (make-time time-utc 0 123)
(make-time time-utc 0 123))
; ==> #t
#!racket/base
(equal? (seconds->date 123)
(seconds->date 123))
; ==> #t
答案 1 :(得分:3)
Racket有一个内置的date
结构:
(struct date ( second
minute
hour
day
month
year
week-day
year-day
dst?
time-zone-offset)
但不是特别好的以编程方式处理日期的功能,也就是说如果你想知道五分钟内的日期,你必须自己完成所有的分钟,小时,天,周,年和夏令时的包装
可以使用eq?
或equal?
或eqv?
对日期进行比较,就像使用任何其他struct
类型一样。
#lang racket
require racket/date)
(define then (current-date))
(define now (current-date))
并使用:
> (eq? then now)
#f
> (eq? then then)
#t
如果你关心纳秒级的粒度,这是很好的,如果你关心任何更大的东西,比如看两个日期是否在同一天。
要比较日期等级的日期,您必须写下以下内容:
(define (same-day? date1 date2)
(and (= (date-day date1)
(date-day date2))
(= (date-month date1)
(date-month date2))
(= (date-year date1)
(date-year date2))))
可用于:
"scratch.rkt"> (same-day? then now)
#t
如果您正在做真正重要的工作,那么使用日期真的很难。像约Joda Time这样的库存在于像Java这样的语言中。不要根据你自己的成长日期库发射导弹。
答案 2 :(得分:2)
如果您已经有绝对秒数,则可以简单地与常用的整数函数进行比较,例如=
,<=
等。
如果您有月,日,年等日期部分,请将其转换为秒,以便您可以执行上述简单操作。为此:
date
结构。date->seconds
将其转换为秒。或者更简单地说,使用find-seconds
,这是(大致)这些的组成。