Okay, so based on Armfoot's response, I decided to use Modernizr to achieve cross-browser time input support. Like I mentioned in my question, the input type needs to be "time" for mobile purposes, because IMO the time picker improves user experience.
I'm not sure if this is the BEST approach, but here is what I did:
Here is the starting HTML for this particular form element:
<div class="form-group">
<label for="StartTime">Time Started</label>
<input class="form-control" type="text" data-type="time" data-val="true" data-val-regex="Time is invalid" data-val-regex-pattern="^(0?[1-9]|1[0-2]):[0-5][0-9]\s*[aApP][mM]\s*$" data-val-required="Start time is required" id="StartTime" name="StartTime" placeholder="Time Started" value="" />
<span class="field-validation-valid" data-valmsg-for="StartTime" data-valmsg-replace="true"></span>
</div>
The initial type is set to "text", and the regular expression for validating the time is:
^(0?[1-9]|1[0-2]):[0-5][0-9]\s*[aApP][mM]\s*$
I used the same expression from the link posted in my question, however I added "\s*" between the time and the AM/PM and also one afterwards, so the it doesn't matter how many spaces go between AM/PM or if the user accidentally adds a space afterwards. The 0? also makes the leading 0 optional.
For JavaScript, I added:
//detect if time input is supported
if (Modernizr.inputtypes.time) {
$('*[data-type="time"]').attr('type', 'time');
$('*[data-type="time"]').removeAttr('data-val-regex');
$('*[data-type="time"]').removeAttr('data-val-regex-pattern');
}
The Modernizr conditional statement checks if the input type "time" is supported by the browser. If it is supported, it changes the type to "time", and removes the data-val-regex attributes since those are NOT supported for type="time".
This seems to work fine across all browsers and devices. I've tested it on Chrome/Chrome Mobile/IE/Firefox/iPad (Safari). The time pickers show up nicely on the iPad and the Nexus devices making this work well for mobile purposes. The regex works properly on Firefox and IE where the time input doesn't get rendered.