@@ -156,9 +156,6 @@ func parseDuration(str string) (time.Duration, error) {
156
156
}
157
157
offset ++
158
158
159
- base := time .Unix (0 , 0 )
160
- t := base
161
-
162
159
var dateStr , timeStr string
163
160
if i := strings .IndexByte (str [offset :], 'T' ); i != - 1 {
164
161
dateStr = str [offset : offset + i ]
@@ -167,38 +164,27 @@ func parseDuration(str string) (time.Duration, error) {
167
164
dateStr = str [offset :]
168
165
}
169
166
167
+ var sum float64
170
168
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" )
180
171
}
181
172
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" )
188
175
}
189
176
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 ])
192
179
if err != nil {
193
180
return 0 , err
194
181
}
182
+ sum += float64 (days ) * 86400
195
183
}
196
- t = t .AddDate (years , months , days )
197
184
}
198
185
199
186
if len (timeStr ) > 0 {
200
187
var pos int
201
- var sum float64
202
188
if i := strings .IndexByte (timeStr [pos :], 'H' ); i != - 1 {
203
189
hours , err := strconv .ParseInt (timeStr [pos :pos + i ], 10 , 64 )
204
190
if err != nil {
@@ -222,11 +208,10 @@ func parseDuration(str string) (time.Duration, error) {
222
208
}
223
209
sum += seconds
224
210
}
225
- t = t .Add (time .Duration (sum * float64 (time .Second )))
226
211
}
227
212
228
213
if minus {
229
- return - t . Sub ( base ), nil
214
+ sum = - sum
230
215
}
231
- return t . Sub ( base ), nil
216
+ return time . Duration ( sum * float64 ( time . Second ) ), nil
232
217
}
0 commit comments