Как перебрать даты в Ракетке? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу перебрать даты от текущей даты до некоторой даты окончания, как в следующем примере в 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())

Я не вижу функций вычисления даты вРакетка, однако.Как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вот как вы можете сделать это, используя арифметику даты, предоставленную 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.

0 голосов
/ 11 февраля 2019

Если вы хотите использовать racket/date, вы можете достичь своей цели с помощью find-seconds, seconds->date, current-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

То есть с сегодняшнего дня (11 февраля 2019 г.) по 1 февраля 2019 г.

Вы также можете использовать gregor или srfi-19 которые являются альтернативными библиотеками дат, которые имеют представление о продолжительности / разнице во времени.

...