项目作者: go-follow

项目描述 :
Working at regular intervals using golang
高级语言: Go
项目地址: git://github.com/go-follow/time-interval.git
创建时间: 2020-10-11T03:24:35Z
项目社区:https://github.com/go-follow/time-interval

开源协议:MIT License

下载


time-interval godoc license

This package helps to work with time intervals. The functionality allows you to perform the following basic operations:

  • Union - merging of time intervals
  • Intersection - finding intersections of regular intervals
  • Except - differentiation between fixed intervals
  • Equal - comparison of time intervals
  • IsIntersection - check for intersection of time intervals

install

  1. go get github.com/go-follow/time-interval

usage

To start using the functionality, you need to initialize a time slot or time slots.
Attention: when initializing intervals, it is important to know that the end date of
the interval must be greater than the start date of the interval.

An example of using a package

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. interval "github.com/go-follow/time-interval"
  6. )
  7. func main() {
  8. timeStart1 := time.Date(2020, 10, 17, 10, 0, 0, 0, time.UTC)
  9. timeEnd1 := time.Date(2020, 10, 17, 15, 0, 0, 0, time.UTC)
  10. timeStart2 := time.Date(2020, 10, 17, 14, 0, 0, 0, time.UTC)
  11. timeEnd2 := time.Date(2020, 10, 17, 19, 0, 0, 0, time.UTC)
  12. newInt, err := interval.New(timeStart1, timeEnd1)
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. newInt2, err := interval.New(timeStart2, timeEnd2)
  17. if err != nil {
  18. log.Fatal(err)
  19. }
  20. newIntMany := interval.NewMany(newInt, newInt2)
  21. result := newIntMany.Union()
  22. fmt.Println(result.String()) // 2020-10-17 10:00:00 +0000 UTC - 2020-10-17 19:00:00 +0000 UTC
  23. }

examples

  • Except

For the Except operation, it is important where the subtraction comes from.
For SpanMany, before returning the final result, is sorted and merged

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. interval "github.com/go-follow/time-interval"
  6. )
  7. func main() {
  8. timeStart1 := time.Date(2020, 10, 18, 9, 0, 0, 0, time.UTC)
  9. timeEnd1 := time.Date(2020, 10, 18, 12, 0, 0, 0, time.UTC)
  10. timeStart2 := time.Date(2020, 10, 18, 11, 0, 0, 0, time.UTC)
  11. timeEnd2 := time.Date(2020, 10, 18, 15, 0, 0, 0, time.UTC)
  12. ti1, err := interval.New(timeStart1, timeEnd1)
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. ti2, err := interval.New(timeStart2, timeEnd2)
  17. if err != nil {
  18. log.Fatal(err)
  19. }
  20. // ti1 \ ti2
  21. ti1ExceptTi2 := ti1.Except(ti2)
  22. fmt.Println(ti1ExceptTi2.String()) // [ 2020-10-18 10:00:00 +0000 UTC - 2020-10-18 11:00:00 +0000 UTC ]
  23. // ti2 \ ti1
  24. ti2ExceptTi1 := ti2.Except(ti1)
  25. fmt.Println(ti2ExceptTi1.String()) // [ 2020-10-18 12:00:00 +0000 UTC - 2020-10-18 15:00:00 +0000 UTC ]
  26. ti1, err := interval.New(time.Date(2020, 10, 18, 7, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 10, 0, 0, 0, time.UTC))
  27. if err != nil {
  28. log.Fatal(err)
  29. }
  30. ti2, err := interval.New(time.Date(2020, 10, 18, 14, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 15, 0, 0, 0, time.UTC))
  31. if err != nil {
  32. log.Fatal(err)
  33. }
  34. ti3, err := interval.New(interval.New(time.Date(2020, 10, 18, 12, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 16, 0, 0, 0, time.UTC))
  35. if err != nil {
  36. log.Fatal(err)
  37. }
  38. ti4, err := interval.New(time.Date(2020, 10, 18, 12, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 14, 30, 0, 0, time.UTC))
  39. if err != nil {
  40. log.Fatal(err)
  41. }
  42. ti5, err := interval.New(time.Date(2020, 10, 18, 14, 33, 0, 0, time.UTC), time.Date(2020, 10, 18, 18, 0, 0, 0, time.UTC)),
  43. if err != nil {
  44. log.Fatal(err)
  45. }
  46. // Except for SpanMany
  47. intervalMany := interval.NewMany(ti1, ti2, ti3, ti4, ti5)
  48. intervalInput, err := interval.New(time.Date(2020, 10, 18, 14, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 15, 0, 0, 0, time.UTC))
  49. if err != nil {
  50. log.Fatal(err)
  51. }
  52. exceptMany := intervalMany.Except(intervalInput)
  53. // [
  54. // 2020-10-18 07:00:00 +0000 UTC - 2020-10-18 10:00:00 +0000 UTC
  55. // 2020-10-18 12:00:00 +0000 UTC - 2020-10-18 14:00:00 +0000 UTC
  56. // 2020-10-18 15:00:00 +0000 UTC - 2020-10-18 18:00:00 +0000 UTC
  57. // ]
  58. fmt.Println(exceptMany.String())
  59. }
  • Union

for SpanMany union operation concatenates and sorts the original result

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. interval "github.com/go-follow/time-interval"
  6. )
  7. func main() {
  8. timeStart1 := time.Date(2020, 10, 17, 12, 0, 0, 0, time.UTC)
  9. timeEnd1 := time.Date(2020, 10, 17, 14, 0, 0, 0, time.UTC)
  10. timeStart2 := time.Date(2020, 10, 17, 22, 0, 0, 0, time.UTC)
  11. timeEnd2 := time.Date(2020, 10, 17, 23, 0, 0, 0, time.UTC)
  12. timeStart3 := time.Date(2020, 10, 17, 13, 0, 0, 0, time.UTC)
  13. timeEnd3 := time.Date(2020, 10, 17, 17, 0, 0, 0, time.UTC)
  14. timeStart4 := time.Date(2020, 10, 17, 7, 0, 0, 0, time.UTC)
  15. timeEnd4 := time.Date(2020, 10, 17, 10, 0, 0, 0, time.UTC)
  16. timeStart5 := time.Date(2020, 10, 17, 21, 0, 0, 0, time.UTC)
  17. timeEnd5 := time.Date(2020, 10, 17, 23, 0, 0, 0, time.UTC)
  18. timeStart6 := time.Date(2020, 10, 17, 11, 0, 0, 0, time.UTC)
  19. timeEnd6 := time.Date(2020, 10, 17, 15, 0, 0, 0, time.UTC)
  20. timeSpan, err := interval.New(timeStart1, timeEnd1)
  21. if err != nil {
  22. log.Fatal(err)
  23. }
  24. timeInput2, err := interval.New(timeStart2, timeEnd2)
  25. if err != nil {
  26. log.Fatal(err)
  27. }
  28. timeInput3, err := interval.New(timeStart3, timeEnd3)
  29. if err != nil {
  30. log.Fatal(err)
  31. }
  32. result := timeSpan.Union(timeInput)
  33. // [
  34. // 2020-10-17 12:00:00 +0000 UTC - 2020-10-17 17:00:00 +0000 UTC
  35. // ]
  36. fmt.Println(result.String())
  37. timeSpanMany1 := interval.NewMany(
  38. timeSpan,
  39. timeInput2,
  40. timeInput3
  41. )
  42. timeSpanMany2 := interval.NewMany()
  43. if err := timeSpanMany2.Add(timeStart4, timeEnd4); err != nil {
  44. log.Fatal(err)
  45. }
  46. timeInput5, err := interval.New(timeStart5, timeEnd5)
  47. if err != nil {
  48. log.Fatal(err)
  49. }
  50. timeInput6, err := interval.New(timeStart6, timeEnd6)
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. timeSpanMany2.AddMany(timeInput5, timeInput6)
  55. resultMany := timeSpanMany1.Union(timeSpanMany2)
  56. // [
  57. // 2020-10-17 07:00:00 +0000 UTC - 2020-10-17 10:00:00 +0000 UTC
  58. // 2020-10-17 11:00:00 +0000 UTC - 2020-10-17 17:00:00 +0000 UTC
  59. // 2020-10-17 21:00:00 +0000 UTC - 2020-10-17 23:00:00 +0000 UTC
  60. // ]
  61. fmt.Println(resultMany.String())
  62. }
  • Intersection
    ```go
    package main

import (
“fmt”
“time”

  1. interval "github.com/go-follow/time-interval"

)

func main() {
timeStart1 := time.Date(2020, 10, 17, 7, 0, 0, 0, time.UTC)
timeEnd1 := time.Date(2020, 10, 17, 12, 0, 0, 0, time.UTC)
timeStart2 := time.Date(2020, 10, 17, 10, 0, 0, 0, time.UTC)
timeEnd2 := time.Date(2020, 10, 17, 15, 0, 0, 0, time.UTC)
timeStart3 := time.Date(2020, 10, 17, 20, 0, 0, 0, time.UTC)
timeEnd3 := time.Date(2020, 10, 17, 22, 0, 0, 0, time.UTC)
timeStart4 := time.Date(2020, 10, 17, 18, 0, 0, 0, time.UTC)
timeEnd4 := time.Date(2020, 10, 17, 23, 0, 0, 0, time.UTC)
timeStart5 := time.Date(2020, 10, 17, 7, 0, 0, 0, time.UTC)
timeEnd5 := time.Date(2020, 10, 17, 10, 0, 0, 0, time.UTC)

  1. newInt, err := interval.New(timeStart1, timeEnd1)
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. newInt2, err := interval.New(timeStart2, timeEnd2)
  6. if err != nil {
  7. log.Fatal(err)
  8. }
  9. result := newInt.Intersection(newInt2)
  10. fmt.Println(result.String()) // 2020-10-17 10:00:00 +0000 UTC - 2020-10-17 12:00:00 +0000 UTC
  11. timeStartInput := time.Date(2020, 10, 17, 10, 0, 0, 0, time.UTC)
  12. timeEndInput := time.Date(2020, 10, 17, 19, 0, 0, 0, time.UTC)
  13. intervalInput, err := interval.New(timeStartInput, timeEndInput)
  14. if err != nil {
  15. log.Fatal(err)
  16. }
  17. newInt3, err := interval.New(timeStart3, timeEnd3)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. newInt4, err := interval.New(timeStart4, timeEnd4)
  22. if err != nil {
  23. log.Fatal(err)
  24. }
  25. newInt5, err := interval.New(timeStart5, timeEnd5)
  26. if err != nil {
  27. log.Fatal(err)
  28. }
  29. timeSpanMany := interval.NewMany(newInt, newInt2, newInt3, newInt4, newInt5)
  30. resultMany := timeSpanMany.Intersection(intervalInput)
  31. // [
  32. // 2020-10-17 10:00:00 +0000 UTC - 2020-10-17 12:00:00 +0000 UTC
  33. // 2020-10-17 10:00:00 +0000 UTC - 2020-10-17 15:00:00 +0000 UTC
  34. // 2020-10-17 18:00:00 +0000 UTC - 2020-10-17 19:00:00 +0000 UTC
  35. // ]
  36. fmt.Println(resultMany.String())

}

  1. * Equal
  2. It is possible to pass an optional argument offset, which gives the possibility of a small error in the final result
  3. ```go
  4. package main
  5. import (
  6. "fmt"
  7. "time"
  8. interval "github.com/go-follow/time-interval"
  9. )
  10. func main() {
  11. timeStart1 := time.Date(2020, 10, 18, 15, 0, 0, 0, time.UTC)
  12. timeEnd1 := time.Date(2020, 10, 18, 21, 0, 0, 0, time.UTC)
  13. timeStart2 := time.Date(2020, 10, 18, 14, 50, 0, 0, time.UTC)
  14. timeEnd2 := time.Date(2020, 10, 18, 21, 10, 0, 0, time.UTC)
  15. ti1, err := interval.New(timeStart1, timeEnd1)
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. ti2, err := interval.New(timeStart2, timeEnd2)
  20. if err != nil {
  21. log.Fatal(err)
  22. }
  23. ti2AddSecond, err := interval.New(timeStart2, timeEnd2.Add(1 * time.Second))
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. // Equal without offset
  28. fmt.Println(ti1.Equal(ti2)) // false
  29. // Equal with offset 10 minute
  30. fmt.Println(ti1.Equal(ti2, time.Minute * 10)) // true
  31. // Add 1 second to ti2
  32. fmt.Println(ti1.Equal(ti2AddSecond, time.Minute * 10)) // false
  33. // Equal for SpanMany
  34. // If there is at least one match, return true
  35. newInt1, err := interval.New(time.Date(2020, 10, 18, 9, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 10, 0, 0, 12, time.UTC))
  36. if err != nil {
  37. log.Fatal(err)
  38. }
  39. newInt2, err := interval.New(time.Date(2020, 10, 18, 19, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 20, 0, 0, 0, time.UTC))
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43. newInt3, err := interval.New(time.Date(2020, 10, 18, 16, 55, 0, 0, time.UTC), time.Date(2020, 10, 18, 18, 0, 0, 11, time.UTC))
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. intervalMany := interval.NewMany(newInt1, newInt2, newInt3)
  48. // Equal without offset
  49. intervalInput, err := interval.New(time.Date(2020, 10, 18, 17, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 18, 5, 0, 11, time.UTC))
  50. if err != nil {
  51. log.Fatal(err)
  52. }
  53. fmt.Println(intervalMany.Equal(intervalInput)) // false
  54. // Equal with offset
  55. fmt.Println(intervalMany.Equal(intervalInput, time.Minute * 5)) // true
  56. fmt.Println(intervalMany.Equal(intervalInput, time.Minute * 4)) // false
  57. }
  • IsIntersection

It is possible to pass an optional argument offset, which gives the possibility of a small error in the final result
```go
package main

import (
“fmt”
“time”

  1. interval "github.com/go-follow/time-interval"

)

func main() {
timeStart1 := time.Date(2020, 10, 18, 17, 30, 0, 0, time.UTC)
timeEnd1 := time.Date(2020, 10, 18, 18, 22, 0, 0, time.UTC)
timeStart2 := time.Date(2020, 10, 18, 16, 0, 0, 0, time.UTC)
timeEnd2 := time.Date(2020, 10, 18, 17, 30, 7, 0, time.UTC)
ti1, err := interval.New(timeStart1, timeEnd1)
if err != nil {
log.Fatal(err)
}
ti2, err := interval.New(timeStart2, timeEnd2)
if err != nil {
log.Fatal(err)
}
// IsIntersection without offset
fmt.Println(ti1.IsIntersection(ti2)) // true
// IsIntersection with offset 5 second
fmt.Println(ti1.IsIntersection(ti2, time.Second 5)) // true
// IsIntersection with offset 10 second
fmt.Println(ti1.IsIntersection(ti2, time.Second
10)) // false

  1. // IsIntersection for SpanMany
  2. // If there is at least one match, return true
  3. newInt1, err := interval.New(time.Date(2020, 10, 18, 9, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 10, 0, 0, 0, time.UTC))
  4. if err != nil {
  5. log.Fatal(err)
  6. }
  7. newInt2, err := interval.New(time.Date(2020, 10, 18, 16, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 17, 5, 0, 0, time.UTC))
  8. if err != nil {
  9. log.Fatal(err)
  10. }
  11. newInt3, err := interval.New(time.Date(2020, 10, 18, 19, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 20, 0, 0, 0, time.UTC))
  12. intervalMany := interval.NewMany(newInt1, newInt2, newInt3)
  13. // IsIntersection without offset
  14. intervalInput, err := interval.New(time.Date(2020, 10, 18, 17, 0, 0, 0, time.UTC), time.Date(2020, 10, 18, 18, 0, 0, 0, time.UTC))
  15. if err != nil {
  16. log.Fatal(err)
  17. }
  18. fmt.Println(intervalMany.IsIntersection(intervalInput)) // true
  19. // IsIntersection with offset
  20. fmt.Println(intervalMany.IsIntersection(intervalInput, time.Minute * 5)) // false
  21. fmt.Println(intervalMany.IsIntersection(intervalInput, time.Minute * 3)) // true

}