Documentation
¶
Overview ¶
Package daterange is a powerful and intuitive Go package designed for handling date intervals efficiently and effectively. This library simplifies operations such as comparing dates, checking overlaps, and processing date ranges in Go applications.
Index ¶
- type DateRange
- func (d DateRange) Contains(date time.Time) bool
- func (d DateRange) Difference(other DateRange) DateRanges
- func (d DateRange) From() time.Time
- func (d DateRange) Includes(other DateRange) bool
- func (d DateRange) Intersection(other DateRange) DateRange
- func (d DateRange) IsZero() bool
- func (d DateRange) Overlaps(other DateRange) bool
- func (d DateRange) String() string
- func (d DateRange) To() time.Time
- func (d DateRange) Union(other DateRange) DateRanges
- type DateRanges
- func (drs *DateRanges) Append(dataRange ...DateRange)
- func (drs *DateRanges) Contains(date time.Time) bool
- func (drs *DateRanges) Equal(other DateRanges) bool
- func (drs *DateRanges) FirstDate() time.Time
- func (drs *DateRanges) IsAllDatesIn(other DateRange) bool
- func (drs *DateRanges) IsAnyDateIn(other DateRange) bool
- func (drs *DateRanges) IsZero() bool
- func (drs *DateRanges) LastDate() time.Time
- func (drs *DateRanges) Len() int
- func (drs *DateRanges) SplitInclusive(date time.Time) (DateRanges, DateRanges)
- func (drs DateRanges) String() string
- func (drs *DateRanges) ToSlice() []DateRange
Examples ¶
- DateRange.Contains
- DateRange.Difference
- DateRange.From
- DateRange.Includes
- DateRange.Intersection
- DateRange.IsZero
- DateRange.Overlaps
- DateRange.String
- DateRange.To
- DateRange.Union
- DateRanges.Append
- DateRanges.Contains
- DateRanges.Equal
- DateRanges.FirstDate
- DateRanges.IsAllDatesIn
- DateRanges.IsAnyDateIn
- DateRanges.IsZero
- DateRanges.LastDate
- DateRanges.Len
- DateRanges.SplitInclusive
- DateRanges.String
- DateRanges.ToSlice
- MustNewDateRange
- NewDateRange
- NewDateRanges
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type DateRange ¶
type DateRange struct {
// contains filtered or unexported fields
}
DateRange is an **inclusive** range of dates. The range is defined by two dates.
func MustNewDateRange ¶
MustNewDateRange returns a new DateRange from the given dates. This automatically truncates the time portion of the dates, ignoring the time zone (for example 2024-01-26 9pm EST will still be the 26th of January 2024). This panics if the truncated `from` date is after the truncated `to` date. Use NewDateRange if you want to automatically order input dates.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.MustNewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.String())
}
Output: {2024-01-26 - 2024-01-28}
func NewDateRange ¶
NewDateRange returns a new DateRange from the given dates. This automatically order input dates and truncates the time portion of the dates, ignoring the time zone (for example 2024-01-26 9pm EST will still be the 26th of January 2024). Use MustNewDateRange if you want to panic if `from` date if after the `to`date .
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.String())
}
Output: {2024-01-26 - 2024-01-28}
func (DateRange) Contains ¶
Contains returns true if the given date is in the range. The range is inclusive.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.Contains(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC)))
}
Output: true
func (DateRange) Difference ¶
func (d DateRange) Difference(other DateRange) DateRanges
Difference returns a DateRanges collection that is the difference of the two DateRanges
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 16, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.Difference(daterange.NewDateRange(time.Date(2024, 1, 20, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 24, 0, 0, 0, 0, time.UTC))).String())
}
Output: [{2024-01-16 - 2024-01-19} {2024-01-25 - 2024-01-28}]
func (DateRange) From ¶
From returns the start date of the range, as midnight of that day, UTC time.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.From().Format("2006-01-02"))
}
Output: 2024-01-26
func (DateRange) Includes ¶
Includes returns true if the given range is included in the range. The range is inclusive.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.Includes(daterange.NewDateRange(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC))))
}
Output: true
func (DateRange) Intersection ¶
Intersection returns the intersection of the two DateRanges
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.Intersection(daterange.NewDateRange(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC))).String())
}
Output: {2024-01-27 - 2024-01-28}
func (DateRange) IsZero ¶
IsZero returns true if the both dates of range are zero
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Time{}, time.Time{})
fmt.Println(dr.IsZero())
}
Output: true
func (DateRange) Overlaps ¶
Overlaps returns true if the given range overlaps with the range. The range is inclusive.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.Overlaps(daterange.NewDateRange(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC))))
}
Output: true
func (DateRange) String ¶
String returns a string representation of the DateRange
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.String())
}
Output: {2024-01-26 - 2024-01-28}
func (DateRange) To ¶
To returns the end date of the range, as midnight of that day, UTC time.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.To().Format("2006-01-02"))
}
Output: 2024-01-28
func (DateRange) Union ¶
func (d DateRange) Union(other DateRange) DateRanges
Union returns a DateRanges collection that is the union of the two DateRanges
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRange
dr := daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC))
fmt.Println(dr.Union(daterange.NewDateRange(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC))).String())
}
Output: [{2024-01-26 - 2024-01-29}]
type DateRanges ¶
type DateRanges struct {
// contains filtered or unexported fields
}
DataRanges is a collection of DateRange elements
func NewDateRanges ¶
func NewDateRanges(dataRanges ...DateRange) DateRanges
NewDateRanges returns a new collection with given elements
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.String())
}
Output: [{2024-01-26 - 2024-01-31}]
func (*DateRanges) Append ¶
func (drs *DateRanges) Append(dataRange ...DateRange)
Append adds the given elements to the collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
)
drs.Append(daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)))
fmt.Println(drs.String())
}
Output: [{2024-01-26 - 2024-01-31}]
func (*DateRanges) Contains ¶
func (drs *DateRanges) Contains(date time.Time) bool
Contains returns true if the given date is in the collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.Contains(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC)))
}
Output: true
func (*DateRanges) Equal ¶
func (drs *DateRanges) Equal(other DateRanges) bool
Equal returns true if the collection is equal to the given collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs1 := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
)
drs2 := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs1.Equal(drs2))
}
Output: true
func (*DateRanges) FirstDate ¶
func (drs *DateRanges) FirstDate() time.Time
FirstDate returns the first date of the collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.FirstDate().Format("2006-01-02"))
}
Output: 2024-01-26
func (*DateRanges) IsAllDatesIn ¶
func (drs *DateRanges) IsAllDatesIn(other DateRange) bool
IsAllDatesIn returns true if all dates in the given DateRange are in the collection Zero DateRange is always considered to be in the collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.IsAllDatesIn(
daterange.NewDateRange(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
))
}
Output: true
func (*DateRanges) IsAnyDateIn ¶
func (drs *DateRanges) IsAnyDateIn(other DateRange) bool
IsAnyDateIn returns true if any date in the given DateRange is in the collection Zero DateRange is always considered to be in the collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.IsAnyDateIn(
daterange.NewDateRange(time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC)),
))
}
Output: true
func (*DateRanges) IsZero ¶
func (drs *DateRanges) IsZero() bool
IsZero returns true if the collection is empty
Example ¶
package main
import (
"fmt"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges()
fmt.Println(drs.IsZero())
}
Output: true
func (*DateRanges) LastDate ¶
func (drs *DateRanges) LastDate() time.Time
LastDate returns the last date of the collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.LastDate().Format("2006-01-02"))
}
Output: 2024-01-31
func (*DateRanges) Len ¶
func (drs *DateRanges) Len() int
Len returns the number of elements in the collection
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.Len())
}
Output: 1
func (*DateRanges) SplitInclusive ¶ added in v1.0.0
func (drs *DateRanges) SplitInclusive(date time.Time) (DateRanges, DateRanges)
SplitInclusive splits the collection into two collections based on the given date The given date is included in both collections
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 3, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 27, 0, 0, 0, 0, time.UTC)),
)
before, after := drs.SplitInclusive(time.Date(2024, 1, 20, 0, 0, 0, 0, time.UTC))
fmt.Println(before.String(), after.String())
}
Output: [{2024-01-01 - 2024-01-03} {2024-01-15 - 2024-01-20}] [{2024-01-20 - 2024-01-27}]
func (DateRanges) String ¶
func (drs DateRanges) String() string
String returns a string representation of the collection. Items are guaranteed to be sorted, non-overlapping and non-zero. Any adjacent periods are merged.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.String())
}
Output: [{2024-01-26 - 2024-01-31}]
func (*DateRanges) ToSlice ¶
func (drs *DateRanges) ToSlice() []DateRange
ToSlice returns the members of the collection as a slice. Items are guaranteed to be sorted, non-overlapping and non-zero. Any adjacent periods are merged.
Example ¶
package main
import (
"fmt"
"time"
daterange "github.com/felixenescu/date-range"
)
func main() {
// Create a new DateRanges
drs := daterange.NewDateRanges(
daterange.NewDateRange(time.Date(2024, 1, 26, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 28, 0, 0, 0, 0, time.UTC)),
daterange.NewDateRange(time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC), time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)),
)
fmt.Println(drs.ToSlice())
}
Output: [{2024-01-26 - 2024-01-31}]