Gaucheプログラミング(立読み版) > 第2部: 実用 > スケジュールCGIを書こう > 時間型と日付型 > その月の日数を求める


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

その月の日数を求める 応援する 

ある月の日数を求めるには、次の月の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

[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation