Regular expression for matching HH:MM time format

I want a regexp for matching time in HH:MM format. Here's what I have, and it works:

^[0-2][0-3]:[0-5][0-9]$

This matches everything from 00:00 to 23:59.

However, I want to change it so 0:00 and 1:00, etc are also matched as well as 00:00 and 01:30. I.e to make the leftmost digit optional, to match HH:MM as well as H:MM.

Any ideas how to make that change? I need this to work in javascript as well as php.

2

21 Answers

Your original regular expression has flaws: it wouldn't match 04:00 for example.

This may work better:

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

Regular Expressions for Time

  • HH:MM 12-hour format, optional leading 0

     /^(0?[1-9]|1[0-2]):[0-5][0-9]$/
  • HH:MM 12-hour format, optional leading 0, mandatory meridiems (AM/PM)

     /((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))/
  • HH:MM 24-hour with leading 0

     /^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
  • HH:MM 24-hour format, optional leading 0

     /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
  • HH:MM:SS 24-hour format with leading 0

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

Reference and Demo

11

None of the above worked for me. In the end I used:

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

Logic:

The first number (hours) is either: a number between 0 and 19 --> [0-1]?[0-9] (allowing single digit number)
or
a number between 20 - 23 --> 2[0-3]

the second number (minutes) is always a number between 00 and 59 --> [0-5][0-9] (not allowing a single digit)

3

You can use this one 24H, seconds are optional

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

The best would be for HH:MM without taking any risk.

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

Amazingly I found actually all of these don't quite cover it, as they don't work for shorter format midnight of 0:0 and a few don't work for 00:00 either, I used and tested the following:

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

You can use this regular expression:

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

If you want to exclude 00:00, you can use this expression

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

Second expression is better option because valid time is 00:01 to 00:59 or 0:01 to 23:59. You can use any of these upon your requirement.Regex101 link

1

As you asked the left most bit optional, I have done left most and right most bit optional too, check it out

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

It matches with

0:0
00:00
00:0
0:00
23:59
01:00
00:59

The live link is available here

None of the above answers worked for me, the following one worked.

"[0-9]{2}:[0-9]{2}"
2

To validate 24h time, use:

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

This accepts:

22:10
2:10
2/1
...

But does not accept:

25:12
12:61
...

Description

hours:minutes with:

  • Mandatory am|pm or AM|PM
  • Mandatory leading zero 05:01 instead of 5:1
  • Hours from 01 up to 12
  • Hours does not accept 00 as in 00:16 am
  • Minutes from 00 up to 59

01:16 am
01:16 AM
01:16 ❌ (misses am|pm)
01:16 Am❌ (am must all be either lower or upper case)
1:16 am ❌ (Hours misses leading zero)
00:16 ❌ (Invalid hours value 00)

Regular Expression

To match single occurrence:
^(0[1-9]|1[0-2]):([0-5][0-9]) ((a|p)m|(A|P)M)$

To match multiple occurrences:
Remove ^ $
(0[1-9]|1[0-2]):([0-5][0-9]) ((a|p)m|(A|P)M)

You can use following regex:

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

Declare

private static final String TIME24HOURS_PATTERN = "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]";
public boolean validate(final String time) { pattern = Pattern.compile(TIME24HOURS_PATTERN); matcher = pattern.matcher(time); return matcher.matches();
}

This method return "true" when String match with the Regular Expression.

A slight modification to Manish M Demblani's contribution above handles 4am (I got rid of the seconds section as I don't need it in my application)

^(([0-1]{0,1}[0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[1-9]|1[0-2])(:|\.)[0-5][0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|\.)[0-5][0-9]))$

handles: 4am 4 am 4:00 4:00am 4:00 pm 4.30 am etc..

1

The below regex will help to validate hh:mm format

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

Your code will not work properly as it will not work for 01:00 type formats. You can modify it as follows.

pattern =r"^(0?[1-9]|1[0-2]):[0-5][0-9]$"

Making it less complicated we can use a variable to define our hours limits.Further we can add meridiems for more accurate results.

hours_limit = 12
pattern = r"^[1-hours_limit]:[0-5][0-9]\s?[AaPp][Mm]$"
print(re.search(pattern, "2:59 pm"))
0

Mine is:

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

This is much shorter

Got it tested with several example

Match:

  • 00:00
  • 7:43
  • 07:43
  • 19:00
  • 18:23

And doesn't match any invalid instance such as 25:76 etc ...

2

You can try the following

^\d{1,2}([:.]?\d{1,2})?([ ]?[a|p]m)?$

It can detect the following patterns :

2300
23:00
4 am
4am
4pm
4 pm
04:30pm
04:30 pm
4:30pm
4:30 pm
04.30pm
04.30 pm
4.30pm
4.30 pm
23:59
0000
00:00
0

check this masterfull timestamp detector regex I built to look for a user-specified timestamp, examples of what it will pickup include, but is most definitely NOT limited to;

8:30-9:40
09:40-09 : 50
09 : 40-09 : 50
09:40 - 09 : 50
08:00to05:00
08 : 00to05 : 00
08:00 to 05:00
8am-09pm
08h00 till 17h00
8pm-5am
08h00,21h00
06pm untill 9am

It'll also pickup many more, as long as the times include digits

1

Try the following

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

Note: I was assuming the javascript regex engine. If it's different than that please let me know.

0

You can use following regex :

^[0-2]?[0-3]:[0-5][0-9]$

Only modification I have made is leftmost digit is optional. Rest of the regex is same.

0

You Might Also Like