2

我有 2 个文本框,并想计算这 2 个文本框之间的时间差。我得到了它的工作,但它几乎没有,至少我认为我只是让它与一些“黑客”一起工作。

如果某些事情不正确,它也会失败,并且会抛出我想阻止的异常(可能使用 IF,如果不正确则忽略)。

这是代码:

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            var first = TimeSpan.ParseExact(First.Text.Replace("-", ":").Remove(First.Text.LastIndexOf("-"), 1).Insert(First.Text.Length - 4, "."), "g", CultureInfo.InvariantCulture);
            var last = TimeSpan.ParseExact(Last.Text.Replace("-", ":").Remove(First.Text.LastIndexOf("-"), 1).Insert(First.Text.Length - 4, "."), "g", CultureInfo.InvariantCulture);
            var difference = first - last;
            CalcDiff.Text = difference.TotalSeconds.ToString("F3");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

正如你所看到的,它有很多“替换”和各种各样的东西,只是为了让它发挥作用。

我提供的格式是这样的:

2013-05-22 12-07-55-324

就此而言,我只关心时间,即:12-07-55-324

所以,我告诉它用 : 替换 - 让它工作,以及类似的东西。

那么,有没有办法改进它。我可以制作某种条件,所以我不能只是按下按钮,如果它不正确(例如格式错误,或者那里什么都没有,或者是文本),它将失败。

4

2 回答 2

5

您可以使用可以通过以下方式解析TimeOfDay的 a :DateTimeDateTime.ParseExact

string dtString = "2013-05-22 12-07-55-324";
TimeSpan ts = DateTime.ParseExact(dtString, "yyyy-MM-dd HH-mm-ss-fff", CultureInfo.InvariantCulture).TimeOfDay;

DEMO

您可以使用DateTime.TryParseExact来检查字符串是否可以成功解析:

DateTime firstDt;
DateTime lastDt;
if ( DateTime.TryParseExact(First.Text, "yyyy-MM-dd HH-mm-ss-fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out firstDt )
  && DateTime.TryParseExact(Last.Text,  "yyyy-MM-dd HH-mm-ss-fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out lastDt ))
{
    // successfully parsed both Datetimes
    var difference = firstDt.TimeOfDay - lastDt.TimeOfDay;
    CalcDiff.Text = difference.TotalSeconds.ToString("F3");
}

这是一种更易读的方法,因为您担心if-statement 的复杂性:

DateTime firstDt, lastDt;
bool canParseFirst = DateTime.TryParseExact(First.Text, "yyyy-MM-dd HH-mm-ss-fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out firstDt);
bool canParseLast =  DateTime.TryParseExact(Last.Text,  "yyyy-MM-dd HH-mm-ss-fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out lastDt );
if(canParseFirst && canParseLast)
{
    // successfully parsed both Datetimes
    var difference = firstDt.TimeOfDay - lastDt.TimeOfDay;
    CalcDiff.Text = difference.TotalSeconds.ToString("F3");
}
else
{ 
    // inform the user
} 
于 2013-08-29T21:20:11.450 回答
2

你应该DateTime改用,你仍然可以很容易地得到两次的差异(只是谷歌找到了两个DateTime对象之间的差异),而且你可以TryParseExact用来指定奇怪的格式,就像你在那里一样。加上该方法将有助于缓解您提到的那些讨厌的异常!true如果解析成功,它将简单地返回,否则返回 false,而不是抛出异常。

于 2013-08-29T21:19:36.883 回答