将h:m:s和m:s字符串转换为TimeSpan对象的简单方法是什么?

dix*_*hom 3 c# datetime

我正在尝试将时间戳字符串转换为TimeSpan对象.但是,TimeSpan.Parse()不能像我期望的那样工作.我会解释原因.

我想转换两种类型的时间戳.

  1. 分:秒
    例如30:53,1:23,0:05
  2. 小时:分钟:秒
    例如1:30:53,2:1:23,0:0:3

问题是,类型1在TimeSpan.Parse()方法中被解释为小时:分钟格式.

Console.WriteLine(TimeSpan.Parse("12:43"));
// the result I expect -> 0:12:43
// the actual result -> 12:43:00
Run Code Online (Sandbox Code Playgroud)

我搜索了这个问题并发现了这个SO帖子.
将HH.mm格式的字符串解析为TimeSpan

这用于DateTime.ParseExact()以特定格式解析字符串.但是,问题是我需要为类型1和2使用不同的格式.

// ok
var ts1 = DateTime.ParseExact("7:33", "m:s", CultureInfo.InvariantCulture).TimeOfDay;
// throws an exception
var ts2 = DateTime.ParseExact("1:7:33", "m:s", CultureInfo.InvariantCulture).TimeOfDay;
// throws an exception
var ts3 = DateTime.ParseExact("7:33", "h:m:s", CultureInfo.InvariantCulture).TimeOfDay;
// ok
var ts4 = DateTime.ParseExact("1:7:33", "h:m:s", CultureInfo.InvariantCulture).TimeOfDay;
Run Code Online (Sandbox Code Playgroud)

我也查了MSDN,但没用.
https://msdn.microsoft.com/ja-jp/library/se73z7b9(v=vs.110).aspx

所以我想出的解决方案如下.

答:DateTime.ParseExact如果

string s = "12:43";
TimeSpan ts;
if (s.Count(c => c == ':') == 1)
    ts = DateTime.ParseExact(s, "m:s", CultureInfo.InvariantCulture).TimeOfDay;
else
    ts = DateTime.ParseExact(s, "h:m:s", CultureInfo.InvariantCulture).TimeOfDay;
Run Code Online (Sandbox Code Playgroud)

B. TimeSpan.Parse用if

string s = "12:43";
if (s.Count(c => c == ':') == 1)
    s = "0:" + s;
var ts = TimeSpan.Parse(s);
Run Code Online (Sandbox Code Playgroud)

但它们都很冗长而且不"酷".感觉就像是在重新发明轮子.我不想要他们,任何接受者?

那么将h:m:s和m:s字符串转换为TimeSpan对象的简单方法是什么?

提前致谢!

Dmi*_*nko 5

您可以在TimeSpan.ParseExact中指定多种格式:

  string source = "17:29";

  TimeSpan result = TimeSpan.ParseExact(source, 
    new string[] { @"h\:m\:s", @"m\:s" }, 
    CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们h:m:s首先尝试格式化,然后m:s如果第一种格式失败.

测试:

  string[] tests = new string[] { 
     // minutes:seconds
    "30:53", "1:23", "0:05", 
     // hours:minutes:seconds 
    "1:30:53", "2:1:23", "0:0:3" };

  var report = string.Join(Environment.NewLine, tests
    .Select(test => TimeSpan.ParseExact(
       test, 
       new string[] { @"h\:m\:s", @"m\:s" },
       CultureInfo.InvariantCulture)));

  Console.Write(report);
Run Code Online (Sandbox Code Playgroud)

结果:

00:30:53
00:01:23
00:00:05
01:30:53
02:01:23
00:00:03
Run Code Online (Sandbox Code Playgroud)