ある月の日数を求めるには、次の月の1日とその月の1日との差を求めます。
ここではsrfi-19ライブラリの<date>型として各月の1日を扱います。srfi-19ライブラリを使うにはまず(use srfi-19)を評価させる必要があります。
「次の月、前の月を求める」と同様に、月と年を与えて任意の月の1日を生成するmake-month手続きをまず書いておきます。
(define (make-month m y)
(make-date 0 0 0 0 1 m y (date-zone-offset (current-date))))
make-monthを使うと、任意の<date>型の値を与えてその月の1日を得るfirst-day-of-month関数は次の通りに書けます。
(define (first-day-of-month date)
(make-month (date-month date) (date-year date)))
「次の月、前の月を求める」で書いた、次の月を求めるnext-month手続きは次の通りでした。
(define (next-month date)
(if (= (date-month date) 12)
(make-month 1 (+ (date-year date) 1))
(make-month (+ (date-month date) 1) (date-year date))))
「正確数と非正確数の変換」で触れたinexact->exact手続き、「日数(=日付の差)を計算する」で触れたdate->modified-julian-dayを使うと、その月の日数を計算するday-of-month手続きは次の通りに書けます。
(define (days-of-month date)
(inexact->exact
(- (date->modified-julian-day (next-month date))
(date->modified-julian-day (first-day-of-month date)))))
例:
gosh> (define today (current-date))
today
gosh> today
#<date 2007/01/17 20:12:21.088613000 (32400)>
gosh> (days-of-month today)
31
gosh> (days-of-month (next-month today))
28