比较球拍的日期

时间:2015-05-20 15:58:53

标签: functional-programming scheme racket

球拍中是否有内置功能来比较2个日期?

如果没有,任何人都可以告诉我如何编写一个函数来比较球拍中的2个日期。我是函数式编程语言的新手,请帮助。

3 个答案:

答案 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

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)

  • 如果您已经有绝对秒数,则可以简单地与常用的整数函数进行比较,例如=<=等。

  • 如果您有月,日,年等日期部分,请将其转换为秒,以便您可以执行上述简单操作。为此:

    1. 创建一个球拍date结构。
    2. 使用date->seconds将其转换为秒。
    3. 或者更简单地说,使用find-seconds,这是(大致)这些的组成。