2014-04-19 49 views
1

我有下面這段代碼簡化方法,以確保時間是正確的格式

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」形式表示一個文本框,用於表示以小時,分鐘和秒爲單位的時間的字符串。

我不喜歡我的代碼的外觀,我想知道是否有一個更簡單更有趣的方式來做到這一點。

+2

對此使用正則表達式。 '/^\ d {2}:\ d {2}:\ d {2} $ /' - 簡單得多,IMOHO。 (請注意,這個正則表達式與原始代碼類似,測試的是* format *,但不是* correctness *。也就是說,它應該用於*連詞*和實際邏輯,以檢測'99:88:77'是垃圾儘管它是一種「有效格式」。) – user2864740

+2

刪除此問題並詢問代碼審閱。 –

+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$/ 
+0

如果翻譯成其他語言:確保'\ d'匹配ASCII數字(與所有的Unicode數字相反;我可能只是使用'[0-9]',但這是一個味道問題),'''和'$'匹配一個字符串的開始和結尾(而不是一行的開始和結尾)。 –

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 

如果圖案是確定的,它返回分割後的字符串數組,否則返回空

正則表達式快得多,當涉及到文本/字符串操作。

希望這會有所幫助。

讓我貼。

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. 大致相當於parseFloat(str) <= num
  2. 每個捕獲的字符串將是範圍爲 「00」 - 「99」。