【问题标题】:How to change a string format like 2d30m to timespan?如何将像 2d30m 这样的字符串格式更改为时间跨度?
【发布时间】:2017-07-03 05:34:38
【问题描述】:

我不知道这种格式在编程语言中称为2d30m 是什么。但是,我看到一些 Jquery 插件或 Youtube 使用这种时间格式跳转到时间 url,例如 &t=3m11s。因为我不知道 excat 关键字,所以很难 google。

所以,我想使用这种格式并在 C# 中翻译成TimeSpan 对象。我怎样才能做到这一点?

现在我正在尝试通过此代码从字符串中提取值

public static void Main()
{
    String str = "2d30m";
    int day = 0, minute = 0;
    //Get Day
    day = Helper(str, "d");
    //Get Minute
    minute = Helper(str, "m");
    //Create timespan
    var myTimeSpan = new TimeSpan(days: day, hours: 0, minutes: minute, seconds: 0);
    Console.Write(myTimeSpan);
}

public static int Helper(string input, string timeCode)
{
    int output = 0;
    int indexOf = input.LastIndexOf(timeCode, StringComparison.OrdinalIgnoreCase);
    if (indexOf > 0)
    {
        string strTime = input.Substring(Math.Max(0, indexOf - 2), 2);
        Console.WriteLine(strTime);
        strTime = System.Text.RegularExpressions.Regex.Replace(strTime, "[^0-9.]", ""); // remove all alphabet
        output = Convert.ToInt32(strTime);
    }

    return output;
}

【问题讨论】:

    标签: c# asp.net .net datetime timespan


    【解决方案1】:

    你可以使用TimeSpan.ParseExact:

    var str = "2d30m";
    // d matches both 1 and 2 digit days
    // \d means literal "d"
    // m matches both 1 and 2 digit minutes
    // \m is literal "m"
    var timeSpan = TimeSpan.ParseExact(str, @"d\dm\m", CultureInfo.InvariantCulture);
    

    【讨论】:

    • 如果我尝试输入三位数分钟,这将不起作用,即“2d120m”
    • @vantian 是的,不幸的是,这是时间跨度解析方法的限制 - 它不接受与目标组件范围不匹配的值(0-24 表示小时,0-60 表示分钟和秒)。跨度>
    • 啊,我明白了。所以它必须匹配天、分钟、秒、小时的目标范围。好吧,这也是可以接受的。但我需要稍后验证用户输入的范围。两种解决方案都很好,感谢 Evk 和 FrankerZ
    • 对,但幸运的是天没有范围(所以“4000d30m”很好)。只有小时\分钟\秒应该匹配它们各自的范围。
    【解决方案2】:

    只需对整个字符串使用Regex.Match。很容易获得团体:

    public static void Main()
    {
        var str = "2d30m";
        //Regex match and find the 2 & 30
        var matches = Regex.Match(@"^(\d+)d(\d+)m$", str);
        //Get Day
        var day = int.Parse(matches.Groups[1].Value);
        //Get Minute
        var minute = int.Parse(matches.Groups[2].Value);
        //Create timespan
        var myTimeSpan = new TimeSpan(days: day, hours: 0, minutes: minute, seconds: 0);
        Console.Write(myTimeSpan);
    }
    

    在此处查看dotnetfiddle

    【讨论】:

    • 太棒了,它的作品。你介意解释一下正则表达式在代码中的作用吗?
    • @vantian 查看右上角here的解释部分。
    • 知道了,我只知道我们是否可以使用正则表达式中的数组组。每天学习新东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多