| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- package openTime
- import (
- "errors"
- "fmt"
- "strings"
- "time"
- cherryString "github.com/cherry-game/cherry/extend/string"
- ctime "github.com/cherry-game/cherry/extend/time"
- cherryLogger "github.com/cherry-game/cherry/logger"
- )
- var parserMap = map[Type]Parser{
- OpenForever: &foreverParser{},
- OpenDaily: &dailyParser{},
- OpenWeeklyContinual: &weeklyContinualParser{},
- OpenWeekly: &weeklyParser{},
- OpenMonthlyContinual: &monthlyContinualParser{},
- OpenMonthly: &monthlyParser{},
- OpenFixedRange: &fixedRangeParser{},
- OpenPeriodic: &periodicParser{},
- }
- type (
- // OpenTime 开启时间
- OpenTime interface {
- // Between 判断时间 t 是否在开启时间内
- Between(t *ctime.CherryTime) bool
- // TimeRange 返回开启时间 [startTime, endTime] 区间
- TimeRange(t *ctime.CherryTime) (ctime.CherryTime, ctime.CherryTime)
- }
- Parser interface {
- Parse(string) (OpenTime, error)
- }
- durationRange struct {
- startTime time.Duration
- endTime time.Duration
- }
- timeRange struct {
- startTime ctime.CherryTime
- endTime ctime.CherryTime
- }
- )
- // Parse 根据开启时间类型 typ 解析 params
- func Parse(typ Type, params string) (OpenTime, error) {
- if parser, ok := parserMap[typ]; ok {
- return parser.Parse(params)
- }
- return nil, errors.New("unknown open time type")
- }
- // Parse 根据开启时间类型 typ 解析 params, 解析失败返回 DefaultOpenTime
- func ParseDefault(typ Type, params string) OpenTime {
- parser, ok := parserMap[typ]
- if !ok {
- return DefaultOpenTime
- }
- open, err := parser.Parse(params)
- if err != nil {
- cherryLogger.Warnf("OpenTime parse failed: [type=%d, params=%s] %v", typ, params, err)
- return DefaultOpenTime
- }
- return open
- }
- // parseDuration HH:mm
- func parseDuration(s string) (time.Duration, error) {
- hms := strings.Split(s, ":")
- var duration time.Duration
- hour, ok := cherryString.ToInt64(hms[0])
- if !ok {
- return 0, fmt.Errorf("nonsupport time string: %s", s)
- }
- duration += time.Duration(hour) * time.Hour
- if len(hms) >= 2 {
- mins, ok := cherryString.ToInt64(hms[1])
- if !ok {
- return 0, fmt.Errorf("nonsupport time string: %s", s)
- }
- duration += time.Duration(mins) * time.Minute
- }
- if len(hms) >= 3 {
- secs, ok := cherryString.ToInt64(hms[2])
- if !ok {
- return 0, fmt.Errorf("nonsupport time string: %s", s)
- }
- duration += time.Duration(secs) * time.Second
- }
- return duration, nil
- }
- // parseDateTime yyyyMMdd/HH:mm
- func parseDateTime(str string) (t ctime.CherryTime, e error) {
- dt := strings.Split(str, "/")
- if len(dt) < 2 {
- e = fmt.Errorf("nonsupport params: %s", str)
- return
- }
- date, err := time.Parse("20060102", dt[0])
- if err != nil {
- e = err
- return
- }
- duration, err := parseDuration(dt[1])
- if err != nil {
- e = err
- return
- }
- t.Time = date.Add(duration)
- return t, nil
- }
|