TimeCursor is a library to get the next or previous date time along the rules that are given in a crontab-like format.

Installation

Add this line to your application’s Gemfile:

gem 'time_cursor'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install time_cursor
or
$ gem install -l time_cursor-x.x.x.gem

Usage

Initialize matcher

time_cursor  =  TimeCursor.new( at: '2015-02-26 01:23' )
time_cursor  =  TimeCursor.new( year: 2015, month: 2, day: 26, hour: 1, min: 23 )

time_cursor  =  TimeCursor.new( cron: '0  9,17  *  *  mon-fri' )
time_cursor  =  TimeCursor.new( wday: 'mon-fri', hour: [9,17] )

time_cursor  =  TimeCursor.new( cron: '0  12  1-7  *  sun' )
time_cursor  =  TimeCursor.new( day: 1..7, wday: 'sun', hour: 12 )

time_cursor  =  TimeCursor.new( sec: '*/10' )

Get next time

time_cursor  =  TimeCursor.new( cron: '* * * * *' )             = => =<TimeCursor::Matcher>
time  =  time_cursor.next( '2015-02-26 01:23' )                 = => 2015-02-26 01:24:00
time  =  time_cursor.next( time )                               = => 2015-02-26 01:25:00

Get previous time

time_cursor  =  TimeCursor.new( hour: '*/3' )                   = => =<TimeCursor::Matcher>
time  =  time_cursor.prev( '2015-02-26 01:23' )                 = => 2015-02-26 00:00:00
time  =  time_cursor.prev( time )                               = => 2015-02-25 21:00:00

Check to match

time_cursor  =  TimeCursor.new( day: 26, hour: 12 )             = => =<TimeCursor::Matcher>
time  =  time_cursor.match( '2015-02-26 12:00' )                = => 2015-02-26 12:00:00
time  =  time_cursor.match( '2015-02-26 00:00' )                = => nil

Reference

Create a new TimeCursor with conditions.

TimeCursor.new( at: nil, cron: nil, year: nil, month: nil, day: nil, wday: nil, hour: nil, min: nil, sec: 0, msec: nil )
  • Result:

    • TimeCursor::Matcher object.

  • Parameter:

    • at: time. Time or String object. (default: nil)

    • cron: set of min, hour, day, month, wday pattern. (default: nil)

    • year: year. unlimited range is denied. (default: nil)

    • month: month. 1..12, jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec. (default: nil)

    • day: day of month. 1..31. (default: nil)

    • wday: day of week. 0..7, sun, mon, tue, wed, thr, fri, sat. (default: nil)

    • hour: minute. 0..23. (default: nil)

    • min: minute. 0..59. (default: nil)

    • sec: second. 0..59. (default: 0)

    • msec: millisecond. 0..999. (default: nil), If msec is assigned, then other parameters are ignored. In detail, it can use "*" as wildcard.

Get next time

TimeCursor::Matcher#next( time = Time.now )
  • Result:

    • Next Time object or nil.

  • Parameter:

    • time: base time. Time or String object. (default: Time.now)

Get previous time

TimeCursor::Matcher#prev( time = Time.now )
  • Result:

    • Previous Time object or nil.

  • Parameter:

    • time: base time. Time or String object. (default: Time.now)

Check to match

TimeCursor::Matcher#match( time )
  • Result:

    • Time object or nil.

  • Parameter:

    • time: Time or String object for matching.

Caution

Because it is calculated in local time, it does not work as expected when switching to daylight saving time.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/arimay/time_cursor.

License

The gem is available as open source under the terms of the MIT License.