简化方法以确保时间格式正确

时间:2014-04-19 18:03:14

标签: javascript time

我有以下代码

 function isProperTimeForm(clockTime)
{
    return     (clockTime.length == 8) 
            && (isDecimal(clockTime.charAt(0))) 
            && (isDecimal(clockTime.charAt(1)))
            && (clockTime.charAt(2) == ':')
            && (isDecimal(clockTime.charAt(3)))
            && (isDecimal(clockTime.charAt(4)))
            && (clockTime.charAt(5) == ':')
            && (isDecimal(clockTime.charAt(6)))
            && (isDecimal(clockTime.charAt(7)));
}

function isDecimal(c) 
{
    return c <= '9' && c >= '0';
}

正如您可能知道的那样,我正在使用的函数来确定用户是否以适当的“hh:mm:ss”形式为文本框提供输入,该文本框用于表示时间的字符串以小时,分钟和秒为单位。

我不喜欢我的代码外观,我想知道是否有一种更简单,更漂亮的方式。

4 个答案:

答案 0 :(得分:4)

只需使用regular expression

function isProperTimeForm(clockTime) {
    return /^\d{2}:\d{2}:\d{2}$/.test(clockTime);
}

如果您不熟悉正则表达式语法,请按以下步骤操作:

  • ^$锚定正则表达式以确保它适用于整个字符串。如果没有这个,正则表达式可以匹配字符串的部分并仍然返回true。
  • \d代表一位数字。
  • {2}表示前面的匹配恰好有两个,在本例中为\d。这使其相当于\d\d
  • :只代表一个字面冒号。

如果你想验证时间可能是实时的(即不是像45:73:89那样),你可以使用更复杂的正则表达式:

// 12-hour time:
/^(1[0-2]|0[1-9]):[0-5]\d:[0-5]\d$/

// 24-hour time:
/^(2[0-3]|[01]\d):[0-5]\d:[0-5]\d$/

答案 1 :(得分:0)

您可以使用正则表达式来执行此操作。有关教程,请参阅https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions

答案 2 :(得分:0)

您可以使用以下正则表达式

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

示例:

/^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$/.exec('12:20:30');

<强>解释

^                   # Start of string
(?:                 # Try to match...
 (?:                #  Try to match...
  ([01]?\d|2[0-3]): #   HH:
 )?                 #  (optionally).
 ([0-5]?\d):        #  MM: (required)
)?                  # (entire group optional, so either HH:MM:, MM: or nothing)
([0-5]?\d)          # SS (required)
$                   # End of string

如果模式正常,则返回分割字符串的数组,否则返回null

正则表达式在文本/字符串操作方面要快得多。

希望这有帮助。

让我发布。

答案 3 :(得分:0)

如果我正在编写这样的功能(从头开始),我会使用格式的正则表达式和条件逻辑的组合来检查组件范围。

以下是12小时制,但通过保持逻辑分离,可以轻易改变以支持24小时时钟格式 - 甚至是部分格式,如“9:00” ”

function validTime(time) {
    // check format - \d{2} means "match two digits 0..9"
    var m = (time || "").match(/^(\d{2}):(\d{2}):(\d{2})$/)
    // check correctness
    return (m
        && m[1] > 0 && m[1] <= 12
        && m[2] <= 59
        && m[3] <= 59)
}

validTime()            // -> false
validTime("00:11:22")  // -> false (no 00 on 12-hour clock)
validTime("12:59:59")  // -> true
validTime("23:59:59")  // -> false (no 23 on 12-hour clock)

以上代码依赖于几个观察结果:

  1. str <= num大致相当于parseFloat(str) <= num
  2. 每个捕获的字符串都在“00” - “99”范围内。