@@ -156,9 +156,6 @@ func parseDuration(str string) (time.Duration, error) {
156156 }
157157 offset ++
158158
159- base := time .Unix (0 , 0 )
160- t := base
161-
162159 var dateStr , timeStr string
163160 if i := strings .IndexByte (str [offset :], 'T' ); i != - 1 {
164161 dateStr = str [offset : offset + i ]
@@ -167,38 +164,27 @@ func parseDuration(str string) (time.Duration, error) {
167164 dateStr = str [offset :]
168165 }
169166
167+ var sum float64
170168 if len (dateStr ) > 0 {
171- var pos int
172- var err error
173- var years , months , days int
174- if i := strings .IndexByte (dateStr [pos :], 'Y' ); i != - 1 {
175- years , err = strconv .Atoi (dateStr [pos : pos + i ])
176- if err != nil {
177- return 0 , err
178- }
179- pos += i + 1
169+ if i := strings .IndexByte (dateStr , 'Y' ); i != - 1 {
170+ return 0 , errors .New ("input duration contains Years notation" )
180171 }
181172
182- if i := strings .IndexByte (dateStr [pos :], 'M' ); i != - 1 {
183- months , err = strconv .Atoi (dateStr [pos : pos + i ])
184- if err != nil {
185- return 0 , err
186- }
187- pos += i + 1
173+ if i := strings .IndexByte (dateStr , 'M' ); i != - 1 {
174+ return 0 , errors .New ("input duration contains Months notation" )
188175 }
189176
190- if i := strings .IndexByte (dateStr [ pos :] , 'D' ); i != - 1 {
191- days , err = strconv .Atoi (dateStr [pos : pos + i ])
177+ if i := strings .IndexByte (dateStr , 'D' ); i != - 1 {
178+ days , err : = strconv .Atoi (dateStr [0 : i ])
192179 if err != nil {
193180 return 0 , err
194181 }
182+ sum += float64 (days ) * 86400
195183 }
196- t = t .AddDate (years , months , days )
197184 }
198185
199186 if len (timeStr ) > 0 {
200187 var pos int
201- var sum float64
202188 if i := strings .IndexByte (timeStr [pos :], 'H' ); i != - 1 {
203189 hours , err := strconv .ParseInt (timeStr [pos :pos + i ], 10 , 64 )
204190 if err != nil {
@@ -222,11 +208,10 @@ func parseDuration(str string) (time.Duration, error) {
222208 }
223209 sum += seconds
224210 }
225- t = t .Add (time .Duration (sum * float64 (time .Second )))
226211 }
227212
228213 if minus {
229- return - t . Sub ( base ), nil
214+ sum = - sum
230215 }
231- return t . Sub ( base ), nil
216+ return time . Duration ( sum * float64 ( time . Second ) ), nil
232217}
0 commit comments