Skip to content

Commit d0add2d

Browse files
committed
fix: honor negative minutes seconds colon parsing
1 parent cc1f990 commit d0add2d

1 file changed

Lines changed: 48 additions & 6 deletions

File tree

src/Humanizer/TimeSpanDehumanizeExtensions.cs

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)