验证有效时间的正则表达式

17
我需要一个正则表达式来验证时间格式。有效的时间范围是从0:00到23:59。当时间小于10:00时,正则表达式应该支持单个数字。以下是有效的时间格式: - 9:00 - 09:00

抱歉,我打错了,我希望第一个数字支持1个字符。例如:2:00和02:00。 - juan
00:0001:00,……是有效值吗? - Gumbo
你为什么只想要正则表达式的答案呢? - Crash893
它用于RegularExpressionValidator的使用。 - juan
9个回答

46

尝试使用这个正则表达式:

^(?:[01]?[0-9]|2[0-3]):[0-5][0-9]$

更明确地说:

^(?:0?[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$

8

我不想抄袭任何人的辛勤工作,但这篇文章似乎正是你要找的。

using System.Text.RegularExpressions;

public bool IsValidTime(string thetime)
{
    Regex checktime =
        new Regex(@"^(20|21|22|23|[01]d|d)(([:][0-5]d){1,2})$");

    return checktime.IsMatch(thetime);
}

我不明白为什么这个代码会得到赞,因为它并不能正常工作。那三个 d 字符只能匹配字面上的字符 d,所以对于 "00:00""23:59" 它返回 false,但对于 "0d:0d" 却返回 true。它们应该改为 \d[0-9] 来匹配任何十进制数字。该博客文章的下一行,这里没有提到,是 "时间正则表达式 用于控制时间的是 ^(20|21|22|23|[01]\d|\d)(([:][0-5]\d){1,2})$"。 - Lance U. Matthews

8

我会使用 DateTime.TryParse()。

DateTime time;
string timeStr = "23:00"

if(DateTime.TryParse(timeStr, out time))
{
  /* use time or timeStr for your bidding */
}

这是用于客户端验证的。 - juan

2

如果您想允许使用上午和下午(可选且不区分大小写)来表示时间的军事时间制标准时间制,那么您可以尝试以下方法。

^(?:(?:0?[1-9]|1[0-2]):[0-5][0-9]\s?(?:[AP][Mm]?|[ap][m]?)?|(?:00?|1[3-9]|2[0-3]):[0-5][0-9])$ 

2
正则表达式^(2[0-3]|[01]\d)([:][0-5]\d)$应匹配00:00到23:59。我不懂C#,因此无法提供相关代码。

2

虽然有点晚了,但我创建了这个正则表达式,我发现它对于24小时制的时间格式(HH:mm:ss或HH:mm或H:mm:ss或H:mm)效果最佳:

private bool TimePatternValidation(string time)
    => new Regex(@"^(([0-1]?[0-9])|([2][0-3]))(:([0-5][0-9])){1,2}$").IsMatch(time);

正如您所指出的,这与“HH:mm:ss”格式相匹配,而该问题并未要求此格式,但无法匹配“H:mm”格式,而该格式是该问题所要求的。 - Lance U. Matthews
没错,我已经修复了它。 现在它可以适用于每个时间模式(HH:mm:ss | H:mm:ss | HH:mm | H:mm)。 - user13295451

1
[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9]:[0-5][0-9] (am|pm|AM|PM)$", 
                   ErrorMessage = "Invalid Time.")]

试试这个


3
为什么应该让OP “尝试这个”?一个好的答案将总是解释做了什么以及为什么以那种方式来做,不仅为了OP而且还为了将来在SO上发现这个问题并阅读你的答案的访问者们。 - Maximilian Ast

0

更好!!!

    public bool esvalida_la_hora(string thetime)
    {
        Regex checktime = new Regex("^(?:0?[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$");
        if (!checktime.IsMatch(thetime))
            return false;

        if (thetime.Trim().Length < 5)
            thetime = thetime = "0" + thetime;

        string hh = thetime.Substring(0, 2);
        string mm = thetime.Substring(3, 2);

        int hh_i, mm_i;
        if ((int.TryParse(hh, out hh_i)) && (int.TryParse(mm, out mm_i)))
        {
            if ((hh_i >= 0 && hh_i <= 23) && (mm_i >= 0 && mm_i <= 59))
            {
                return true;
            }
        }
        return false;
    }

为什么这样更好?看起来这个答案不符合问题的标准? - roydukkey

0
public bool IsTimeString(string ts)
{
    if (ts.Length == 5 && ts.Contains(':'))
    {
        int h;
        int m;
        return int.TryParse(ts.Substring(0, 2), out h) 
                            && int.TryParse(ts.Substring(3, 2), out m) 
                            && h >= 0 && h < 24 
                            && m >= 0 && m < 60;
     }
     else
         return false;
}

1
在你的回答中添加更多细节。 - Haroldo Gondim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接