c#秒以字符串格式到TimeSpan

本文关键字:TimeSpan 格式 字符串 | 更新日期: 2023-09-27 18:15:14

我遇到了一点问题。

我想做的是把这个字符串27.0转换成一个时间跨度。

我试了所有我能想到的方法来让它工作。

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

我基本上有4个值

27.052.41:24.41:43.3

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

谢谢!

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

c#秒以字符串格式到TimeSpan

您可以使用两种不同的方法。使用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'填充毫秒的字符串组件,正如在注释中指出的那样。