Time Ranges Go Reference Go codecov

Package trn introduces a Range type with useful methods to perform complex
operations over time ranges.

Install and update

go get -u github.com/cappuccinotm/trn

Usage

rng := trn.New(time.Now(), 3 * time.Hour, trn.In(time.UTC))

betweenRng := trn.Between(time.Now(), time.Now().Add(3 * time.Hour), trn.In(time.UTC))

For more examples see test file.

Todo

  • Make UTC and opts tests work in UTC location

Methods

  • func New(start time.Time, duration time.Duration, opts ...Option) Range

    Creates a new Range with start at the given time and with the given duration.

  • func Between(start, end time.Time, opts ...Option) Range

    Creates a new Range within the given time range. Between uses the location
    of the start time for the range.

    Note: Between panics if the start time is later than the end time.

  • func (r Range) Stratify(duration time.Duration, interval time.Duration) []Range

    Slices the range into smaller ones with fixed duration and fixed interval
    between their starts.
    In case if the last interval doesn’t fit into the given duration, Stratify
    won’t return it.

Illustration

stratify illustration

  • func (r Range) Split(duration time.Duration, interval time.Duration) []Range

    Slices the range into smaller ones with fixed duration and fixed interval
    between the end of the one range and start of next range.
    In case if the last interval doesn’t fit into the given duration, Split
    won’t return it.

Illustration

split illustration

  • func (r Range) Truncate(bounds Range) Range

    Cuts the start and the end of the range to fit the given bounds.

Illustration

truncate illustration

  • MergeOverlappingRanges(ranges []Range) []Range
Illustration

merge illustration

  • func (r Range) Flip(ranges []Range) []Range

    Flips the given ranges within the given period (r).

    The boundaries of the given ranges are considered to be inclusive, which means
    that the flipped ranges will start or end at the exact nanosecond where
    the boundary from the input starts or ends.

    Note: for the sake of safety, ranges are being merged before flip to ensure
    the correct working of method.

Illustration

flip illustration

  • func Intersection(ranges []Range) Range

    Returns the range, which is common for all the given ranges.

Illustration

intersection illustration

There are some other non-algorithmic methods, which you can see in the reference.

Details

String method formats the range in format [start time, end time], where the
times are formatted with the next template:

const defaultRangeFmt = "2006-01-02 15:04:05.999999999 -0700 MST"

GitHub

View Github