如何在球拍中循环浏览日期?

时间:2019-02-11 06:37:19

标签: date racket

我想遍历从当前日期到某个停止日期的日期,例如Python中的以下示例:

import datetime

def count_dates(stop_date):
    step = datetime.date.today()
    while step >= stop_date:
        yield step
        step = step - datetime.timedelta(days=1)

def main():
    for step in count_dates(datetime.date(2018, 1, 1)):
        print(step.isoformat())

但是,我在球拍中看不到任何date calculation functions。该怎么办?

2 个答案:

答案 0 :(得分:4)

如果您想使用racket/date,则可以使用find-secondsseconds->datecurrent-seconds和简单的算法来实现目标:

#lang racket

(require racket/date
         racket/generator)

(define 1day (* 60 60 24))

(define (count-dates year month day)
  (define target (find-seconds 0 0 0 day month year))
  (in-generator
   (let loop ([current (current-seconds)])
     (when (>= current target)
       (yield (seconds->date current))
       (loop (- current 1day))))))

(date-display-format 'iso-8601)
(for ([dt (count-dates 2019 2 1)])
  (displayln (date->string dt)))

这将输出:

2019-02-11
2019-02-10
2019-02-09
2019-02-08
2019-02-07
2019-02-06
2019-02-05
2019-02-04
2019-02-03
2019-02-02
2019-02-01

也就是说,从今天(2019年2月11日)到2019年2月1日。

您还可以使用gregorsrfi-19,它们是具有持续时间/差异概念的备用日期库。

答案 1 :(得分:4)

在这里,您可以使用gregor提供的日期算法来完成此操作。特别是+days-days函数在这里很有帮助:

#lang racket

(require gregor
         racket/generator)

;; Date -> [Sequenceof Date]
(define (count-dates stop-date)
  (in-generator
   (let loop ([step (today)])
     (when (date>=? step stop-date)
       (yield step)
       (loop (-days step 1))))))

(for ([step (count-dates (date 2018 1 1))])
  (displayln (date->iso8601 step)))

如果您需要的不是“一些天数”更一般的内容,还可以使用+date-period-date-period之类的功能。