time_range.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package tsdb
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "time"
  7. )
  8. func NewTimeRange(from, to string) *TimeRange {
  9. return &TimeRange{
  10. From: from,
  11. To: to,
  12. Now: time.Now(),
  13. }
  14. }
  15. type TimeRange struct {
  16. From string
  17. To string
  18. Now time.Time
  19. }
  20. func (tr *TimeRange) MustGetFrom() time.Time {
  21. if res, err := tr.ParseFrom(); err != nil {
  22. return time.Unix(0, 0)
  23. } else {
  24. return res
  25. }
  26. }
  27. func (tr *TimeRange) MustGetTo() time.Time {
  28. if res, err := tr.ParseTo(); err != nil {
  29. return time.Unix(0, 0)
  30. } else {
  31. return res
  32. }
  33. }
  34. func tryParseUnixMsEpoch(val string) (time.Time, bool) {
  35. if val, err := strconv.ParseInt(val, 10, 64); err == nil {
  36. seconds := val / 1000
  37. nano := (val - seconds*1000) * 1000000
  38. return time.Unix(seconds, nano), true
  39. }
  40. return time.Time{}, false
  41. }
  42. func (tr *TimeRange) ParseFrom() (time.Time, error) {
  43. if res, ok := tryParseUnixMsEpoch(tr.From); ok {
  44. return res, nil
  45. }
  46. fromRaw := strings.Replace(tr.From, "now-", "", 1)
  47. diff, err := time.ParseDuration("-" + fromRaw)
  48. if err != nil {
  49. return time.Time{}, err
  50. }
  51. return tr.Now.Add(diff), nil
  52. }
  53. func (tr *TimeRange) ParseTo() (time.Time, error) {
  54. if tr.To == "now" {
  55. return tr.Now, nil
  56. } else if strings.HasPrefix(tr.To, "now-") {
  57. withoutNow := strings.Replace(tr.To, "now-", "", 1)
  58. diff, err := time.ParseDuration("-" + withoutNow)
  59. if err != nil {
  60. return time.Time{}, nil
  61. }
  62. return tr.Now.Add(diff), nil
  63. }
  64. if res, ok := tryParseUnixMsEpoch(tr.To); ok {
  65. return res, nil
  66. }
  67. return time.Time{}, fmt.Errorf("cannot parse to value %s", tr.To)
  68. }