@@ -232,9 +232,9 @@ static bool TryParseColonDuration(string input, TimeSpanDehumanizeColonFormat co
232232 && TryParseInvariantInt ( parts [ 0 ] , out var hours )
233233 && TryParseInvariantInt ( parts [ 1 ] , out var minutes )
234234 && TryParseInvariantDouble ( parts [ 2 ] , out var seconds )
235- && hours >= 0 && minutes >= 0 && seconds >= 0 )
235+ && TryGetColonComponents ( hours , minutes , seconds , out var hoursSign , out var hoursMagnitude , out var minutesMagnitude , out var secondsMagnitude ) )
236236 {
237- result = TimeSpan . FromHours ( hours ) + TimeSpan . FromMinutes ( minutes ) + TimeSpan . FromSeconds ( seconds ) ;
237+ result = hoursSign * ( TimeSpan . FromHours ( hoursMagnitude ) + TimeSpan . FromMinutes ( minutesMagnitude ) + TimeSpan . FromSeconds ( secondsMagnitude ) ) ;
238238 return true ;
239239 }
240240
@@ -243,24 +243,66 @@ static bool TryParseColonDuration(string input, TimeSpanDehumanizeColonFormat co
243243 if ( colonFormat == TimeSpanDehumanizeColonFormat . MinutesSeconds
244244 && TryParseInvariantInt ( parts [ 0 ] , out var minutesOnly )
245245 && TryParseInvariantDouble ( parts [ 1 ] , out var secondsOnly )
246- && minutesOnly >= 0 && secondsOnly >= 0 )
246+ && TryGetColonComponents ( minutesOnly , secondsOnly , out var minutesSign , out var minutesMagnitude , out var secondsMagnitude ) )
247247 {
248- result = TimeSpan . FromMinutes ( minutesOnly ) + TimeSpan . FromSeconds ( secondsOnly ) ;
248+ result = minutesSign * ( TimeSpan . FromMinutes ( minutesMagnitude ) + TimeSpan . FromSeconds ( secondsMagnitude ) ) ;
249249 return true ;
250250 }
251251
252252 if ( TryParseInvariantInt ( parts [ 0 ] , out var hoursOnly )
253253 && TryParseInvariantDouble ( parts [ 1 ] , out var minutesOnlyFromHours )
254- && hoursOnly >= 0 && minutesOnlyFromHours >= 0 )
254+ && TryGetColonComponents ( hoursOnly , minutesOnlyFromHours , out var hoursSign , out var hoursMagnitude , out var minutesMagnitude ) )
255255 {
256- result = TimeSpan . FromHours ( hoursOnly ) + TimeSpan . FromMinutes ( minutesOnlyFromHours ) ;
256+ result = hoursSign * ( TimeSpan . FromHours ( hoursMagnitude ) + TimeSpan . FromMinutes ( minutesMagnitude ) ) ;
257257 return true ;
258258 }
259259 }
260260
261261 return false ;
262262 }
263263
264+ static bool TryGetColonComponents (
265+ int leading ,
266+ double trailing ,
267+ out int sign ,
268+ out int leadingMagnitude ,
269+ out double trailingMagnitude )
270+ {
271+ return TryGetColonComponents (
272+ leading ,
273+ trailing ,
274+ 0 ,
275+ out sign ,
276+ out leadingMagnitude ,
277+ out trailingMagnitude ,
278+ out _ ) ;
279+ }
280+
281+ static bool TryGetColonComponents (
282+ int leading ,
283+ int middle ,
284+ double trailing ,
285+ out int sign ,
286+ out int leadingMagnitude ,
287+ out int middleMagnitude ,
288+ out double trailingMagnitude )
289+ {
290+ if ( middle < 0 || trailing < 0 )
291+ {
292+ sign = 0 ;
293+ leadingMagnitude = 0 ;
294+ middleMagnitude = 0 ;
295+ trailingMagnitude = 0 ;
296+ return false ;
297+ }
298+
299+ sign = leading < 0 ? - 1 : 1 ;
300+ leadingMagnitude = Math . Abs ( leading ) ;
301+ middleMagnitude = middle ;
302+ trailingMagnitude = trailing ;
303+ return true ;
304+ }
305+
264306 static bool TryParseInvariantInt ( string value , out int result ) =>
265307 int . TryParse ( value . Trim ( ) , NumberStyles . Integer , CultureInfo . InvariantCulture , out result ) ;
266308
0 commit comments