字符串格式的C#秒到TimeSpan

2 c# string timespan

我有一点问题.

我想要做的是取这个字符串27.0并将其转换为时间跨度.

为了让它发挥作用,我尝试了各种我能想到的方式.

TimeSpan.Parse("27.0") 我知道这是格式问题,但我不确定要使用的格式.

我基本上有4个值

27.0 52.4 1:24.4 1:43.3

有没有一种简单的方法来处理所有这些格式?

谢谢!

对不起这些都是秒,除了1分钟,所以1分24秒4毫秒

Dav*_*aab 6

您可以使用两种不同的方法.使用TimeSpan.From ...()方法之一.那些将数字转换为TimeSpan.例如,使用27秒将双27转换为TimeSpan

var ts = TimeSpan.FromSeconds(27)
Run Code Online (Sandbox Code Playgroud)

您将面临的唯一问题是它不允许您指定字符串.因此,您可以首先将字符串解析为double.如果你像那样天真地做,那么你可以得到你想要的东西.

var ts = TimeSpan.FromSeconds(double.Parse("27.0"))
Run Code Online (Sandbox Code Playgroud)

但是如果你在具有德语语言环境的系统上运行它,你将得到一个4分30秒的TimeSpan.原因是德语中的一个点不是一个数字的分隔符,它是一千个分隔符.所以这个数字被解析为"270".所以为了安全起见,你还应该提供一个NumberFormat.一个更好的方法是.

var culture = new CultureInfo("en-US");
var tsc = TimeSpan.FromSeconds(double.Parse("27.0", culture.NumberFormat));
Run Code Online (Sandbox Code Playgroud)

现在你得到你的27秒.但问题仍然是它只能正确解析你的两个第一个字符串.您的其他3个字符串仍然无法解析,因为您无法将它们转换为数字.但是我仍然添加了这个,要注意文化差异,如果你只是尝试解析一个数字到一个双重使用TimeSpan.FromSeconds()等等.

现在让我们进一步了解如何解析每个字符串.存在TimeSpan.Parse()和TimeSpan.ParseExact().

现在你仍然必须知道TimeSpan.Parse()使用特定于文化的格式.在没有用冒号分隔时间的国家/地区,TimeSpan.Parse()将失败.最重要的是,TimeSpan至少采用格式"hh:mm".但这种格式的结肠对文化敏感.您可以再次使用"en-US"文化,但它不能解决问题,因为他不接受格式"27.0".

这就是为什么必须使用TimeSpan.ParseExact()方法并提供此方法应该能够解析的格式的原因.它还允许您指定他应该能够解析的格式.你现在应该以这样的结局结束.

var culture = new CultureInfo("en-US");
var formats = new string[] {
    @"s\.f",
    @"ss\.f",
    @"ss\.ff",
    @"m\:ss\.f",
    @"m\:ss\.ff",
    @"mm\:ss\.ff"
};
foreach ( var str in new string[] { "27.0", "52.4", "1:24.4", "1:43.3" } ) {
    var ts = TimeSpan.ParseExact(str, formats, culture.NumberFormat);
    Console.WriteLine(ts.ToString());
}
Run Code Online (Sandbox Code Playgroud)

请注意,在此示例中,我添加了反斜杠以转义点和冒号.如果您不这样做,那么格式化程序本身会将其视为对文化敏感的分隔符.但你想要的只是冒号或点.

这段代码的输出将是

00:00:27
00:00:52.4000000
00:01:24.4000000
00:01:43.3000000
Run Code Online (Sandbox Code Playgroud)