#time #date #calendar #chrono #sequence

kronos

A tool to calculate complex time expressions

10 releases

0.1.5 Mar 11, 2022
0.1.4 Sep 17, 2020
0.1.3 Jul 1, 2020
0.1.2 May 3, 2019
0.0.1 Sep 11, 2016

#74 in Date and time

Download history 6/week @ 2022-11-30 17/week @ 2022-12-07 16/week @ 2022-12-14 11/week @ 2022-12-21 7/week @ 2022-12-28 5/week @ 2023-01-04 6/week @ 2023-01-11 13/week @ 2023-01-18 18/week @ 2023-01-25 34/week @ 2023-02-01 73/week @ 2023-02-08 61/week @ 2023-02-15 17/week @ 2023-02-22 9/week @ 2023-03-01 22/week @ 2023-03-08 52/week @ 2023-03-15

112 downloads per month
Used in fluxcap

MIT license

345KB
1.5K SLoC

Documentation

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 Ranges.

Example

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 = chrono::NaiveDate::from_ymd(2019, 2, 5)
  .and_hms(0, 0, 0);

// A sequence for *Mondays*
let mondays = kronos::Weekday(1);

// First Monday after t0 reference time
mondays.future(&t0).next()

Ranges

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

Composing TimeSequences

Basic sequences

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.

Composite sequences

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.

References

Dependencies

~1MB
~16K SLoC