C# 检查特定时间格式中的字符串

C# 检查特定时间格式中的字符串,c#,time,timespan,tryparse,C#,Time,Timespan,Tryparse,我正在尝试检查时间格式为“hh:mm:ss”的is string(textBox1.Text),以便在Sql查询中将该字符串作为时间参数发送。我使用TimeSpan.TryParseExact方法: TimeSpan check; TimeSpan.TryParseExact(textBox1.Text, "hh:mm:ss", null, out check); if(check==null) MessageBox.Show("incorre

我正在尝试检查时间格式为“hh:mm:ss”的is string(textBox1.Text),以便在Sql查询中将该字符串作为时间参数发送。我使用TimeSpan.TryParseExact方法:

        TimeSpan check;
        TimeSpan.TryParseExact(textBox1.Text, "hh:mm:ss", null, out check);
        if(check==null)   MessageBox.Show("incorrect time");
        else... 

但当我将文本框11写入表格时,添加时间00:00:11(11秒)。我想所以时间不对,正确的是00:00:11行。怎么做才是对的

如果转换成功,您应该更改代码以使用TryParseExact的结果,该结果为布尔值true。还请注意,有一个小时/分钟/秒

TimeSpan check;
if(TimeSpan.TryParseExact("09:00:01", "g", CultureInfo.CurrentCulture, out check))
    MessageBox.Show("Correct");
else
    MessageBox.Show("Incorrect");
编辑
看看下面的评论,你可能需要一个


可以使用正则表达式执行此操作:

using System.Text.RegularExpressions;
namespace StackOverflow
{
    class Demo
    {
        /* ... */
        readonly Regex timeFormat = new Regex(@"^(?:(?:[0-1][0-9])|2[0-3]):[0-5][0-9]:[0-5][0-9]$", RegexOptions.Compiled);
        public bool IsTimeFormatValid(string time)
        {
            return timeFormat.IsMatch(time);
        }
        /* ... */
    }
}
正则表达式示例:

注意:Timespan.TryParse旨在将字符串转换为Timespan。TryParseExact也做了同样的事情;只有它允许您指定区域性/预期格式(它的名称很糟糕,因为它不能强制格式与您指定的格式完全一致)

如果可能,这些方法需要转换;所以他们会很慷慨地接受。它们不是为了验证格式而设计的;仅在基于给定格式转换给定数据时进行最佳尝试。在本例中,给定一个缺少信息的字符串,他们假设未指定小时和分钟意味着它们的值为0,所以他们将数据视为秒


使用正则表达式可以避免这个问题——它表示您希望检查格式,而不仅仅是查看系统是否可以猜测该格式的数据的含义。

您应该使用适合您尝试执行的任务的控件。例如,在这种情况下,用户使用控件而不是文本框可能更容易、更一致

将DateTimePicker的
格式
属性设置为
时间
,将
决战
属性设置为
。您也可以在代码中执行此操作,如下所示

myTimePicker.Format = DateTimePickerFormat.Time;
myTimePicker.ShowUpDown = true;
您还可以使用该属性设置时间显示方式的格式。如果使用
CustomFormat
,则需要执行以下操作:

myTimePicker.Format = DateTimePickerFormat.Custom; //instead of Time as above
myTimePicker.CustomFormat = "hh:mm:ss"; //or whichever format you want

我不知道您在寻找什么行为…测试应该是
if(TimeSpan.TryParseExact(…){…}
,因为
TimeSpan
是一个结构,因此不能为空。您的代码无法编译!结果怎么可能不正确?@OlivierJacot Descombes-
TimeSpan
可以检查
null
,因为
=
运算符被重写,并隐式将结构转换为
可为null的类型。那段代码应该编译得很好(假设
否则…
被正确替换)好的,我试过了。它确实可以有效地编译,但原因是不同的:
TimeSpan
将被装箱,即它将被转换为
对象
;但是,此对象永远不会为
null
,因此
check==null
将始终为false!您还可以测试
5==null
。您将收到一条警告:“表达式的结果始终为“false”,因为类型为“int”的值永远不等于类型为“”的“null”。原因与它被装箱相同,因为它被转换为
TimeSpan?
type。Nullables可以在后台执行此操作,这就是为什么可以检查值类型是否为null。你是对的,上面的代码片段总是会导致false(
check==null
),但我只是澄清一下,检查
TimeSpan
值是否为null是有效的代码,即使在这种情况下是多余的。我试着测试字符串“111”我的结果是check.ToString()上的“111.00:00:00”(111天),但我要求显示“不正确”结果。此测试仅适用于类似“11:10”的测试,结果为“11:10:00”。我尝试了它,但如何不在DateTimePicker的右侧部分显示日历?请将
摊牌属性设置为
true
。您可以在设计器中或在如上所示的代码中执行此操作。
myTimePicker.Format = DateTimePickerFormat.Custom; //instead of Time as above
myTimePicker.CustomFormat = "hh:mm:ss"; //or whichever format you want