【问题标题】:Work around for TimeSpan parsing 24:00解决 TimeSpan 解析 24:00
【发布时间】:2014-01-28 20:50:23
【问题描述】:

我对 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;
}

【问题讨论】:

  • 您可以简单地将字符串“24:00”作为特殊情况处理..
  • @codymanix - 谢谢,我会尝试建议的两个选项

标签: c# timespan


【解决方案1】:

试试这样的

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

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

【讨论】:

  • 谢谢,我已经为这个问题添加了两种解决方案。
【解决方案2】:

此代码可能对您有所帮助:

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?

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 谢谢,我使用时间跨度,因为开始时间也是时间跨度,然后我得到两者之间的小时数。
    • TimeSpan 是表示一天中某个时间的正常 .NET 方式——即每天重复的时间点,或者仅在与日期结合时才完全定义。例如。 DateTime.TimeOfDay.
    • @JonHanna 是的,这在语义上略有不同,在这种情况下,您将一天中的时间表示为与午夜的偏移量 - 这完全可以用时间跨度表示(例如午夜加 8 小时)。如您所说,要表示实际时间点,它必须与DateTime 结合使用。
    【解决方案4】:

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

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

    Parsing times above 24 hours in C#

    【讨论】:

    • 谢谢,我知道你的意思了。只是想看看是否有一个简单的解决方法。我必须至少尝试给客户他们想要的东西! :)
    • 告诉客户他们想要什么! ;) 呵呵
    • 告诉客户他的建议可能不是最佳的并提出不同的方法并没有错。取决于你如何表达它;)
    • 24:00 是许多系统中的有效时间,包括大多数国家标准(但不是大多数国家公约)和 ISO 8601 日期。在 ISO 8601 中,它显然是第二天 00:00 的替代表示的同义词,并通过将其转换为该表示进行规范化。
    • 我在处理时间间隔时遇到了这个问题。在“开始”和“结束”之间是“现在”。表示区间的正确方法是部分有界对,>= "start" 和
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多