字符串格式的C#秒到TimeSpan

时间:2014-07-29 01:25:47

标签: c# string timespan

我对此有点疑问。

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

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

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

我基本上有4个值

27.0 52.4 1:24.4 1:43.3

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

谢谢!

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

2 个答案:

答案 0 :(得分:6)

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

将27转换为TimeSpan 27秒
var ts = TimeSpan.FromSeconds(27)

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

var ts = TimeSpan.FromSeconds(double.Parse("27.0"))

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

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

现在你得到你的27秒。但问题仍然是它只能正确解析你的两个第一个字符串。您的其他3个字符串仍然无法解析,因为您无法将它们转换为数字。但是我仍然添加了这个,要注意文化差异,如果你只是尝试将数字解析为double并使用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());
}

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

此代码的输出将为

00:00:27
00:00:52.4000000
00:01:24.4000000
00:01:43.3000000

答案 1 :(得分:1)

尝试这样的事情:

var timeString = "1:24.4";

var timeComponents = timeString.Split(':', '.').Reverse().ToList();

var milliseconds = timeComponents.Any() ? int.Parse(timeComponents[0]) : 0;
var seconds = timeComponents.Count() > 1 ? int.Parse(timeComponents[1]) : 0;
var minutes = timeComponents.Count() > 2 ? int.Parse(timeComponents[2]) : 0;

var timeSpan = new TimeSpan(0, 0, minutes, seconds, milliseconds);

这将从字面上处理毫秒。您可能希望用“0”填充毫秒的字符串组件,如注释中所指出的那样。