Kronos is a tool for calculating date/times. It is meant to give a concrete date for questions like "When is the 2nd Monday of June?", or "What was the 3rd to last day-of-the-week of past February?".
To answer these questions kronos composes
TimeSequence iterators. These are infinite sequences into the past and the future which you can pin to a particular instant and get resulting time
Lets first define a
TimeSequence that represents any and all Mondays. Then use it to get an iterator of all future Mondays from a specific t0 instant onward.
// Reference time: Tuesday, 5th Feb 2019 let t0 = from_ymd .and_hms; // A sequence for *Mondays* let mondays = Weekday; // First Monday after t0 reference time mondays.future.next
The previous example would return a
Range which represents an open-ended time interval
[start, end). Ranges also have a
Grain that specifies the resolution of the start and end instants.
Examples of a Range could be Aug 26th 2018.
- It has a resolution of Grain::Day,
- starts on 2018/08/26 00:00:00,
- ends on 2018/08/27 00:00:00
Some simple TimeSequences can be built almost out of thin air. For example:
Weekday(2)a sequence for Tuesdays.
Month(6)a sequence for all June months.
Grains(Grain::Day)a sequence to iterate over days.
More comples TimeSequences can be created by combining other sequences. For example:
NthOf(2, Weekday(1), Month(6))creates a sequence for "the second Mondays of June".
LastOf(1, Weekend, Grains(Grain::Year))for "last weekend of the year".
Intersect(Weekday(1), NthOf(28, Grains(Grain::Day), Grains(Grains::Month)))for "all Monday 28th".
Other compositions allow unions, intersections, intervals, exceptions, etc. Please check each module's tests for examples on how to use them.