我对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;
}
答案 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问题并包含一堆可能的解决方案:
答案 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?