Loading src/VideoSlice.Cli/SimpleTimeSpanExpress.cs +71 −2 Original line number Diff line number Diff line Loading @@ -2,13 +2,82 @@ public static class SimpleTimeSpanExpress { /// <summary> /// 将TimeSpan转换为时间表达式。 /// </summary> /// <param name="timeSpan"></param> /// <returns>时间表达式</returns> public static string ToString(TimeSpan timeSpan) { var result = string.Empty; if (timeSpan.Days > 0) result += $"{timeSpan.Days}d"; result += Append(timeSpan.Days, "d"); result += Append(timeSpan.Hours, "h"); result += Append(timeSpan.Minutes, "m"); result += Append(timeSpan.Seconds, "s"); result += Append(timeSpan.Milliseconds, "ms"); result += Append(timeSpan.Microseconds, "us"); return result; } /// <summary> /// 从时间表达式转换到TimeSpan /// </summary> /// <param name="str"></param> /// <returns></returns> public static TimeSpan ToTimeSpan(string str) { var timespan = TimeSpan.Zero; timespan = timespan.Add(TimeSpan.FromDays(Parse(str, "d"))); timespan = timespan.Add(TimeSpan.FromHours(Parse(str, "h"))); timespan = timespan.Add(TimeSpan.FromMinutes(Parse(str, "m"))); timespan = timespan.Add(TimeSpan.FromSeconds(Parse(str, "s"))); timespan = timespan.Add(TimeSpan.FromMilliseconds(Parse(str, "ms"))); timespan = timespan.Add(TimeSpan.FromMicroseconds(Parse(str, "us"))); return timespan; } private static string Append(int value, string unit) { return value > 0 ? $"{value}{unit}" : string.Empty; } public static int Parse(string s, string unit) { var sliced = s.Split(unit); var str = Near(sliced[0]); if (int.TryParse(str, out var value)) { return value < 0 ? throw new InvalidOperationException("值不能为负数。") : value; } throw new InvalidOperationException($"'{sliced[0]}' 不是一个有效的32位整数。"); } private static string Near(string s) { var arr = new char[s.Length]; var count = 0; for (var i = s.Length - 1; i >= 0; i--) { if (char.IsAsciiDigit(s[i])) { arr[i] = s[i]; count++; } else break; } if (count == 0) throw new InvalidOperationException("只包含非数字字符串。"); return new string(arr, arr.Length - count, count); } } No newline at end of file src/VideoSlice.Tests/SimpleTimeSpanExpressTest.cs +13 −4 Original line number Diff line number Diff line using JetBrains.Annotations; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using JetBrains.Annotations; using VideoSlice.Cli; using Xunit; using Assert = Xunit.Assert; namespace VideoSlice.Tests; Loading @@ -10,8 +11,16 @@ public class SimpleTimeSpanExpressTest { [Fact] public void METHOD() public void Should_ToString() { var time = new TimeSpan(1, 2, 3, 4, 5, 6); Assert.Equal("1d2h3m4s5ms6us", SimpleTimeSpanExpress.ToString(time)); } [Fact] public void Should_ToTimeSpan() { var time = "1d2h3m4s5ms6us"; Assert.Equal(new TimeSpan(1, 2, 3, 4, 5, 6), SimpleTimeSpanExpress.ToTimeSpan(time)); } } No newline at end of file Loading
src/VideoSlice.Cli/SimpleTimeSpanExpress.cs +71 −2 Original line number Diff line number Diff line Loading @@ -2,13 +2,82 @@ public static class SimpleTimeSpanExpress { /// <summary> /// 将TimeSpan转换为时间表达式。 /// </summary> /// <param name="timeSpan"></param> /// <returns>时间表达式</returns> public static string ToString(TimeSpan timeSpan) { var result = string.Empty; if (timeSpan.Days > 0) result += $"{timeSpan.Days}d"; result += Append(timeSpan.Days, "d"); result += Append(timeSpan.Hours, "h"); result += Append(timeSpan.Minutes, "m"); result += Append(timeSpan.Seconds, "s"); result += Append(timeSpan.Milliseconds, "ms"); result += Append(timeSpan.Microseconds, "us"); return result; } /// <summary> /// 从时间表达式转换到TimeSpan /// </summary> /// <param name="str"></param> /// <returns></returns> public static TimeSpan ToTimeSpan(string str) { var timespan = TimeSpan.Zero; timespan = timespan.Add(TimeSpan.FromDays(Parse(str, "d"))); timespan = timespan.Add(TimeSpan.FromHours(Parse(str, "h"))); timespan = timespan.Add(TimeSpan.FromMinutes(Parse(str, "m"))); timespan = timespan.Add(TimeSpan.FromSeconds(Parse(str, "s"))); timespan = timespan.Add(TimeSpan.FromMilliseconds(Parse(str, "ms"))); timespan = timespan.Add(TimeSpan.FromMicroseconds(Parse(str, "us"))); return timespan; } private static string Append(int value, string unit) { return value > 0 ? $"{value}{unit}" : string.Empty; } public static int Parse(string s, string unit) { var sliced = s.Split(unit); var str = Near(sliced[0]); if (int.TryParse(str, out var value)) { return value < 0 ? throw new InvalidOperationException("值不能为负数。") : value; } throw new InvalidOperationException($"'{sliced[0]}' 不是一个有效的32位整数。"); } private static string Near(string s) { var arr = new char[s.Length]; var count = 0; for (var i = s.Length - 1; i >= 0; i--) { if (char.IsAsciiDigit(s[i])) { arr[i] = s[i]; count++; } else break; } if (count == 0) throw new InvalidOperationException("只包含非数字字符串。"); return new string(arr, arr.Length - count, count); } } No newline at end of file
src/VideoSlice.Tests/SimpleTimeSpanExpressTest.cs +13 −4 Original line number Diff line number Diff line using JetBrains.Annotations; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using JetBrains.Annotations; using VideoSlice.Cli; using Xunit; using Assert = Xunit.Assert; namespace VideoSlice.Tests; Loading @@ -10,8 +11,16 @@ public class SimpleTimeSpanExpressTest { [Fact] public void METHOD() public void Should_ToString() { var time = new TimeSpan(1, 2, 3, 4, 5, 6); Assert.Equal("1d2h3m4s5ms6us", SimpleTimeSpanExpress.ToString(time)); } [Fact] public void Should_ToTimeSpan() { var time = "1d2h3m4s5ms6us"; Assert.Equal(new TimeSpan(1, 2, 3, 4, 5, 6), SimpleTimeSpanExpress.ToTimeSpan(time)); } } No newline at end of file