Commit 588d4ce0 authored by shrabbit's avatar shrabbit
Browse files

实现时间表达式解析,到字符串17毫秒,到时间2毫秒。

parent 81026085
Loading
Loading
Loading
Loading
+71 −2
Original line number Diff line number Diff line
@@ -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
+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;

@@ -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