如何在C#中解析以下时间?
15:31:58:13943730921
最后11位是什么?
答案 0 :(得分:3)
天真的东西会是:
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
)。其他解决方案显然是可能的。
答案 1 :(得分:0)
这就是我所做的。
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;
}
答案 2 :(得分:0)
如果你想正确地舍入到一个整数和刻度,使用.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
是我们必须扔掉的第一个字符的字符串中的索引。
答案 3 :(得分:-1)
似乎是一个明显的答案..但问题不太清楚。
DataTime time = DateTime.Now;
string myTime = time.ToShortTimeString();
myTime = myTime.SubString(0, 7);