c#秒以字符串格式到TimeSpan
本文关键字:TimeSpan 格式 字符串 | 更新日期: 2023-09-27 18:15:14
我遇到了一点问题。
我想做的是把这个字符串27.0
转换成一个时间跨度。
我试了所有我能想到的方法来让它工作。
TimeSpan.Parse("27.0")
我知道这是一个格式问题,但我不确定使用的格式。
我基本上有4个值
27.0
52.4
1:24.4
1:43.3
是否有一种简单的方法来处理所有这些格式?
谢谢!
对不起,这些都是秒,除了1是分钟所以1分钟24秒4毫秒
您可以使用两种不同的方法。使用TimeSpan.From…()方法之一。它们将数字转换为TimeSpan。例如,要将双27转换为27秒的TimeSpan,可以使用
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个字符串仍然不能解析,因为你不能把它们转换成数字。但我还是添加了这一点,以了解文化差异,如果你只是去尝试解析一个数字为双精度,并使用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
试试这样:
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'填充毫秒的字符串组件,正如在注释中指出的那样。