私は、今まで以下のようにしていました。
- 次月の頭を取得
- 1日減算する
例えば、2010/05 の月末を取得したい場合。
- 2010/06/01 を取得する
- 1から1日減算する
- 2010/05/31 が返る
今日、Gauche のリファレンスを眺めていて、この「1日減算する」というのが見当たらなくて、どうやればいいのかわかりませんでした・・・。
検索してみると、こういうのがありました。
検索してみると、こういうのがありました。
(define (days-of-month date) (inexact->exact (- (date->modified-julian-day (next-month date)) (date->modified-julian-day (current-month date)))))
julian というのが、たぶんユリウス暦のことだろうというのはわかったのですが、ユリウス暦というのが何なのか、実はよく知りませんでした。
Function: current-julian-day [SRFI-19] 現在のユリウス日(Julian day)を返します。Julian dayは -4714-11-24T12:00:00Z (November 24, -4714 at noon, UTC) からの日数を 実数で表現したものです。 |
余談ですが。日付関連って、結構面倒です。業務アプリは日付を扱う機会が多いですよね。プログラマとして仕事を始めたばかりの頃、特に迷走したことを覚えています。
例えば、「期間と基準日を指定して基準日から見て相対的な偶/奇数週の月水金の祝日意外に予定を展開」などの条件指定ができる機能などでしょうか。過去も含めて長期間を指定された場合など、特に面倒そうですね。。まず祝日が面倒ですね。
SQL が面白くて調子に乗っていた時なども悲惨でした。担当していた業務アプリが MSSQL のみのサポートから MSSQL/MySQL サポートになった時などは吐けました。。
--int型の任意の日付から月末を取得する SELECT CAST(CONVERT(VARCHAR, DATEADD(DAYOFYEAR, -1, DATEADD(MONTH, 1, CONVERT(DATETIME, CONVERT(VARCHAR(6), REPLACE(STR(20080215), ' ', '')) + '01 00:00:00', 112))), 112) AS INT) --結果:20080229 |
この場合、サポート DB が増えたことよりも、こういったクエリを散在させていたことが致命的だったわけです。。下級戦士どころじゃねーぞ。
そういえば JavaScript なんかも、月が0始まり(0~11)で驚きましたね。
そういえば JavaScript なんかも、月が0始まり(0~11)で驚きましたね。
0 件のコメント:
コメントを投稿