time.go (2777B)
1 package main 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 ) 8 9 const ( 10 FileNameLayout = "0601021504" 11 DataTimeLayout = time.RFC3339 12 ) 13 14 type Time struct { 15 context time.Time 16 } 17 18 func NewTime(t time.Time) *Time { 19 return &Time{t} 20 } 21 22 func NewTimeToday() *Time { 23 return &Time{time.Now()} 24 } 25 26 func (et *Time) ParseArg(raw string) (time.Time, error) { 27 return et.ParseArgDir(raw, false) 28 } 29 30 func (et *Time) ParseArgRight(raw string) (time.Time, error) { 31 return et.ParseArgDir(raw, true) 32 } 33 34 // TODO(tms) 11.02.23: Simplify 35 func (et *Time) ParseArgDir(raw string, shiftRight bool) (time.Time, error) { 36 parts := strings.Split(raw, " ") 37 hour := et.context.Hour() 38 min := et.context.Minute() 39 sec := et.context.Second() 40 year, mon, day := et.context.Date() 41 42 zeroTime := 0 43 if shiftRight { 44 zeroTime = 59 45 } 46 47 var parsed bool 48 part := parts[0] 49 50 t, err := time.Parse("15", part) 51 if err == nil { 52 parsed = true 53 hour = t.Hour() 54 min = zeroTime 55 sec = zeroTime 56 } 57 58 t, err = time.Parse("15:4", part) 59 if err == nil { 60 parsed = true 61 hour = t.Hour() 62 min = t.Minute() 63 sec = zeroTime 64 } 65 66 t, err = time.Parse("15:4:5", part) 67 if err == nil { 68 parsed = true 69 hour = t.Hour() 70 min = t.Minute() 71 sec = t.Second() 72 } 73 74 t, err = time.Parse("2/1", part) 75 if err == nil { 76 parsed = true 77 hour = zeroTime 78 min = zeroTime 79 sec = zeroTime 80 day = t.Day() 81 mon = t.Month() 82 year = et.context.Year() 83 } 84 85 t, err = time.Parse("1/2006", part) 86 if err == nil { 87 parsed = true 88 hour = zeroTime 89 min = zeroTime 90 sec = zeroTime 91 92 zeroDay := 1 93 firstOfMonth := time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, et.context.Location()) 94 lastOfMonth := firstOfMonth.AddDate(0, 1, -1) 95 if shiftRight { 96 zeroDay = lastOfMonth.Day() 97 } 98 99 day = zeroDay 100 101 mon = t.Month() 102 year = t.Year() 103 } 104 105 t, err = time.Parse("2/1/2006", part) 106 if err == nil { 107 parsed = true 108 hour = zeroTime 109 min = zeroTime 110 sec = zeroTime 111 day = t.Day() 112 mon = t.Month() 113 year = t.Year() 114 } 115 116 if !parsed && len(raw) > 0 { 117 return time.Now(), fmt.Errorf("Cannot parse %q", raw) 118 } 119 120 if len(parts) > 1 { 121 part = parts[1] 122 t, err := time.Parse("2", part) 123 if err == nil { 124 day = t.Day() 125 mon = et.context.Month() 126 year = et.context.Year() 127 } 128 129 t, err = time.Parse("2/1", part) 130 if err == nil { 131 day = t.Day() 132 mon = t.Month() 133 year = et.context.Year() 134 } 135 136 t, err = time.Parse("2/1/2006", part) 137 if err == nil { 138 day = t.Day() 139 mon = t.Month() 140 year = t.Year() 141 } 142 } 143 144 return time.Date(year, mon, day, hour, min, sec, 0, et.context.Location()), nil 145 } 146 147 func (et *Time) ParseEntry(raw string) (time.Time, error) { 148 t, err := time.Parse(DataTimeLayout, raw) 149 return time.Date( 150 t.Year(), 151 t.Month(), 152 t.Day(), 153 t.Hour(), 154 t.Minute(), 155 t.Second(), 156 0, 157 et.context.Location(), 158 ), err 159 }