如何在 C# 中解析以下时间?
15:31:58:13943730921
最后 11 位数字是多少?
一些天真的事情是:
var time = "15:31:58:13943730921";
var str = time.Split(':');
var res = new TimeSpan(int.Parse(str[0]), int.Parse(str[1]), int.Parse(str[2])).Add(TimeSpan.FromTicks((long.Parse(str[3]) + 5000) / 10000));
请注意,如果秒数的位数发生变化,它将不起作用。
啊......它是一个TimeSpan
,而不是一个DateTime
可能:-)
+ 5000) / 10000
是四舍五入到最近的Tick
.
一个更完整的解决方案,可以处理任意数量的数字:
var time = "15:31:58:13943730921";
var str = time.Split(':');
// Used for the rounding
int carryover = 0;
if (str[3].Length < 7)
{
str[3] = str[3] + new string('0', 7 - str[3].Length);
}
else if (str[3].Length > 7)
{
char eight = str[3][7];
if (eight >= 5)
{
carryover = 1;
}
str[3] = str[3].Remove(7);
}
var res = new TimeSpan(int.Parse(str[0]), int.Parse(str[1]), int.Parse(str[2])).Add(TimeSpan.FromTicks(long.Parse(str[3]) + carryover));
请注意,TimeSpan
构造函数不支持小时/分钟/秒 + 刻度,因此我们必须以不同的方式处理它(通过使用.Add
)。其他解决方案显然是可能的。
这就是我所做的。
internal string GetTime(string line)
{
// ...
string tmp = time.Substring(0, 12);
time = DateTime.ParseExact(tmp, "HH:mm:ss:fff", CultureInfo.CurrentUICulture).Ticks.ToString();
return time;
}
如果您想正确舍入为整数和刻度,使用 .NET 4.0 及更高版本,您可以执行以下操作:
string time = "15:31:58:13943730921";
var ts = TimeSpan.ParseExact(time.Remove(16), "h':'mm':'ss':'fffffff", null);
if (time[16] >= '5')
ts += new TimeSpan(1L); // add one tick for better rounding
Console.WriteLine(ts);
16
是我们必须丢弃的第一个字符的字符串中的索引。
可能看起来是一个明显的答案..但问题不太清楚。
DataTime time = DateTime.Now;
string myTime = time.ToShortTimeString();
myTime = myTime.SubString(0, 7);