parsetime.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package parsetime
  2. import (
  3. "strings"
  4. "sync"
  5. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  6. "wartank/pkg/components/parsetime/parsehour"
  7. "wartank/pkg/components/parsetime/parsemin"
  8. "wartank/pkg/components/parsetime/parsesec"
  9. )
  10. /*
  11. Выковыривает из строки время и потокобезопасно хранит его
  12. */
  13. // ParseTime -- потокобезопасный ковырятор строки времени
  14. type ParseTime struct {
  15. intVal int // Числовое значение хранимого времени
  16. hour *parsehour.ParseHour // Часы метки времени
  17. min *parsemin.ParseMin // Минуты метки времени
  18. sec *parsesec.ParseSec // Секунды метки времени
  19. block sync.RWMutex
  20. }
  21. // NewParseTime -- возвращает новый *ParseTime
  22. func NewParseTime() *ParseTime {
  23. return &ParseTime{
  24. hour: parsehour.NewParseHour(),
  25. min: parsemin.NewParseMin(),
  26. sec: parsesec.NewParseSec(),
  27. }
  28. }
  29. // GetInt -- возвращает хранимоесчётчика времени
  30. func (sf *ParseTime) Get() int {
  31. sf.block.RLock()
  32. defer sf.block.RUnlock()
  33. return sf.intVal
  34. }
  35. // Parse -- разбирает строковое представление на части
  36. func (sf *ParseTime) Parse(strTime string) {
  37. sf.block.Lock()
  38. defer sf.block.Unlock()
  39. Hassert(strTime != "", "CountTime.Set(): val is empty")
  40. // Разбить время, перевести в секунды
  41. lstTime := strings.Split(strTime, ":")
  42. if len(lstTime) == 1 { // Только секунды
  43. sf.hour.Reset()
  44. sf.min.Reset()
  45. sf.sec.Parse(lstTime[0])
  46. }
  47. if len(lstTime) == 2 { // Минуты, секунды
  48. sf.hour.Reset()
  49. sf.min.Parse(lstTime[0])
  50. sf.sec.Parse(lstTime[1])
  51. }
  52. if len(lstTime) >= 3 { // Есть всё, возможно с левыми полями в конце
  53. strHour := lstTime[0]
  54. strMin := lstTime[1]
  55. strSec := lstTime[2]
  56. sf.sec.Parse(strSec)
  57. sf.min.Parse(strMin)
  58. sf.hour.Parse(strHour)
  59. }
  60. sf.intVal = sf.hour.Get()*3600 + sf.min.Get()*60 + sf.sec.Get()
  61. }
  62. // Hour -- возвращает хранимые часы
  63. func (sf *ParseTime) Hour() *parsehour.ParseHour {
  64. return sf.hour
  65. }
  66. // Min -- возвращает хранимые минуты
  67. func (sf *ParseTime) Min() *parsemin.ParseMin {
  68. return sf.min
  69. }
  70. // Sec -- возвращает хранимые секунды
  71. func (sf *ParseTime) Sec() *parsesec.ParseSec {
  72. return sf.sec
  73. }
  74. // String -- возвращает хранимое время
  75. func (sf *ParseTime) String() string {
  76. res := sf.hour.String() + ":" + sf.min.String() + ":" + sf.sec.String()
  77. return res
  78. }