date_discreterは日付など歯抜けをチェックするためのgemです
作った経緯
社内で作ってる課金ライブラリが
- 1時間に1回:課金系の実レコードの集計してhourlyレポートを作成
- 1日1回:hourlyレポートを積み上げてdailyレポートを作成
- 1ヶ月に1回:dailyレポートを積み上げてmonthlyレポートを作成
のような積み上げ方式(キングスライム方式)になっているのですが、レポートを積み上げる時に途中のレポートが1つでも欠けていると正しく売上レポートが出ないのでhourlyやdailyの歯抜けを調べるための処理をgemにしました。
詳しくはこちらを読んで下さい
丁度2年前のアドベントカレンダーでOSSにしたということで個人的には思い入れがあります
使い方
-
discrete_months
,discrete_days
,discrete_hours
: 引数に渡したDate
やTime
の配列の歯抜けを返す -
continuous_months?
,continuous_days?
,continuous_hours?
: 引数に渡したDate
やTime
の配列が全部連続している(歯抜けがない)ならtrue
を返す、1つでも歯抜けがあるとfalse
を返す
月の歯抜けを調べる
continuous_months = [
Date.parse("2014-10-01"),
Date.parse("2014-11-01"),
Date.parse("2014-12-01"),
]
DateDiscreter.discrete_months(continuous_months)
#=> []
DateDiscreter.continuous_months?(continuous_months)
#=> true
discrete_months = [
Date.parse("2014-10-01"),
Date.parse("2014-12-01")
]
DateDiscreter.discrete_months(discrete_months)
#=> [#<Date: 2014-11-01 ((2456963j,0s,0n),+0s,2299161j)>]
DateDiscreter.continuous_months?(discrete_months)
#=> false
日の歯抜けを調べる
continuous_days = [
Date.parse("2014-12-01"),
Date.parse("2014-12-02"),
Date.parse("2014-12-03"),
]
DateDiscreter.discrete_days(continuous_days)
#=> []
DateDiscreter.continuous_days?(continuous_days)
#=> true
discrete_days = [
Date.parse("2014-12-01"),
Date.parse("2014-12-03"),
]
DateDiscreter.discrete_days(discrete_days)
#=> [#<Date: 2014-12-02 ((2456994j,0s,0n),+0s,2299161j)>]
DateDiscreter.continuous_days?(discrete_days)
#=> false
時間の歯抜けを調べる
continuous_hours = [
Time.parse("2014-12-01 00:00:00"),
Time.parse("2014-12-01 01:00:00"),
Time.parse("2014-12-01 02:00:00"),
]
DateDiscreter.discrete_hours(continuous_hours)
#=> []
DateDiscreter.continuous_hours?(continuous_hours)
#=> true
discrete_hours = [
Time.parse("2014-12-01 00:00:00"),
Time.parse("2014-12-01 02:00:00"),
]
DateDiscreter.discrete_hours(discrete_hours)
#=> [2014-12-01 01:00:00 +0900]
DateDiscreter.continuous_hours?(discrete_hours)
#=> false
ニッチな用途のためのニッチなgemですがぜひご利用ください