4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sue445Advent Calendar 2016

Day 8

日付の歯抜けをチェックする「date_discreter」

Posted at

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 : 引数に渡した DateTime の配列の歯抜けを返す
  • continuous_months?, continuous_days?, continuous_hours? : 引数に渡した DateTime の配列が全部連続している(歯抜けがない)なら 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ですがぜひご利用ください

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?