解决TimeSpan 24:00解析的问题

时间:2011-09-15 10:09:42

标签: c# timespan

我对TimeSpan类有一个小问题,它可以解析23:59而不是24:00。

当然,客户想要在24:00输入以表示当天结束而不是23:59或00:00,因为00:00表示当天的开始。

目前我的代码解析结束时间如下:

if ( !TimeSpan.TryParse( ( gvr.FindControl( "txtTimeOff" ) as TextBox ).Text, out tsTimeOff ) )
{
   this.ShowValidationError( String.Format( "Please enter a valid 'Time Off' on row '{0}'.", gvr.RowIndex + 1 ) );
   return false;
}

对于这种情况,最好的解决办法是什么?

编辑:(解决方案1)

if ( ( gvr.FindControl( "txtTimeOff" ) as TextBox ).Text == "24:00" )
{
    tsTimeOff = new TimeSpan( 24, 0, 0 );
}
else
{
    if ( !TimeSpan.TryParse( ( gvr.FindControl( "txtTimeOff" ) as TextBox ).Text, out tsTimeOff ) )
    {
         this.ShowValidationError(
            String.Format( "Please enter a valid 'Time Off' on row '{0}'.", gvr.RowIndex + 1 ) );
         return false;
    }
}

编辑:(解决方案2)

string timeOff = ( gvr.FindControl( "txtTimeOff" ) as TextBox ).Text;

if ( !TimeSpan.TryParse(
        timeOff == "24:00" ? "1.00:00:00" : timeOff
        , out tsTimeOff ) )
{
    this.ShowValidationError(
        String.Format( "Please enter a valid 'Time Off' on row '{0}'.", gvr.RowIndex + 1 ) );
    return false;
}

4 个答案:

答案 0 :(得分:8)

尝试这样的事情

textBox = (TextBox) gvr.FindControl ("txtTimeOff");

TimeSpan.TryParse (textBox.Text == "24:00"
                      ? "1.00:00"
                      : textBox.Text,
                   out tsTimeOff)

答案 1 :(得分:4)

通常,System.TimeSpan类不适合表示“时间点”,而是顾名思义,它是时间或持续时间的“跨度”。如果您可以重构代码以使用System.DateTime,或者更好的是System.DateTimeOffset,那将是最佳解决方案。如果那是不可能的话,Yahia的其他答案是你最好的选择:)

答案 2 :(得分:4)

老实说,最好的解决方案是通知您的客户24:00不是有效小时,他应该使用0:00。我从未见过从23:59到24:00的时钟跳跃。

但如果你坚持......查看以下包含相同问题的SO问题并包含一堆可能的解决方案:

Parsing times above 24 hours in C#

答案 3 :(得分:4)

此代码可以帮助您:

string span = "35:15";
TimeSpan ts = new TimeSpan(int.Parse(span.Split(':')[0]),    // hours
                           int.Parse(span.Split(':')[1]),    // minutes
                           0);                               // seconds

来自:How to parse string with hours greater than 24 to TimeSpan?