Встроенные функции имеют специальные правила о том, что означает extern
. (Обратите внимание, что встроенные функции являются расширением C99 или GNU, они не были в оригинале C.
Для не-встроенных функций extern
не требуется, поскольку он включен по умолчанию.
Обратите внимание, что правила для C ++ различны. Например, extern "C"
требуется в объявлении C ++ для функций C, которые вы собираетесь вызывать из C ++, и существуют разные правила inline
.
Быстрое решение, которое работает над входом, который Вы определили:
function parseTime( t ) {
var d = new Date();
var time = t.match( /(\d+)(?::(\d\d))?\s*(p?)/ );
d.setHours( parseInt( time[1]) + (time[3] ? 12 : 0) );
d.setMinutes( parseInt( time[2]) || 0 );
return d;
}
var tests = [
'1:00 pm','1:00 p.m.','1:00 p','1:00pm','1:00p.m.','1:00p','1 pm',
'1 p.m.','1 p','1pm','1p.m.', '1p', '13:00','13', '1a', '12', '12a', '12p', '12am', '12pm', '2400am', '2400pm', '2400',
'1000', '100', '123', '2459', '2359', '2359am', '1100', '123p',
'1234', '1', '9', '99', '999', '9999', '99999', '0000', '0011', '-1', 'mioaw' ];
for ( var i = 0; i < tests.length; i++ ) {
console.log( tests[i].padStart( 9, ' ' ) + " = " + parseTime(tests[i]) );
}
Это должно работать на несколько других вариантов также (даже если утра будет использоваться, это будет все еще работать - например). Очевидно, это довольно сыро, но это также довольно легко (намного более дешевый для использования этого, чем полная библиотека, например).
Предупреждение: самка кода не работает с 12:00, и т.д.
Почему бы не использовать проверку для сужения то, что пользователь может вставить и упростить список, чтобы только включать форматы, которые могут быть проанализированы (или проанализированы после некоторой тонкой настройки).
я не думаю, что это просит, чтобы слишком много потребовало, чтобы пользователь поместил время в поддерживаемый формат.
dd:dd (m)/P (m)
dd (m)/P (m)
dd
/(\d+)(?::(\d\d))(?::(\d\d))?\s*([pP]?)/
// added test for p or P
// added seconds
d.setHours( parseInt(time[1]) + (time[4] ? 12 : 0) ); // care with new indexes
d.setMinutes( parseInt(time[2]) || 0 );
d.setSeconds( parseInt(time[3]) || 0 );
спасибо
Я столкнулся с несколькими петлями в реализации решения John Resig. Вот модифицированная функция, которую я использовал на основе его ответа:
function parseTime(timeString)
{
if (timeString == '') return null;
var d = new Date();
var time = timeString.match(/(\d+)(:(\d\d))?\s*(p?)/);
d.setHours( parseInt(time[1]) + ( ( parseInt(time[1]) < 12 && time[4] ) ? 12 : 0) );
d.setMinutes( parseInt(time[3]) || 0 );
d.setSeconds(0, 0);
return d;
} // parseTime()
var tests = [
'1:00 pm','1:00 p.m.','1:00 p','1:00pm','1:00p.m.','1:00p','1 pm',
'1 p.m.','1 p','1pm','1p.m.', '1p', '13:00','13', '1a', '12', '12a', '12p', '12am', '12pm', '2400am', '2400pm', '2400',
'1000', '100', '123', '2459', '2359', '2359am', '1100', '123p',
'1234', '1', '9', '99', '999', '9999', '99999', '0000', '0011', '-1', 'mioaw' ];
for ( var i = 0; i < tests.length; i++ ) {
console.log( tests[i].padStart( 9, ' ' ) + " = " + parseTime(tests[i]) );
}
Не потрудитесь делать его сами, просто используйте datejs.
Вот улучшение на версия Joe. Не стесняйтесь редактировать его далее.
function parseTime(timeString)
{
if (timeString == '') return null;
var d = new Date();
var time = timeString.match(/(\d+)(:(\d\d))?\s*(p?)/i);
d.setHours( parseInt(time[1],10) + ( ( parseInt(time[1],10) < 12 && time[4] ) ? 12 : 0) );
d.setMinutes( parseInt(time[3],10) || 0 );
d.setSeconds(0, 0);
return d;
}
var tests = [
'1:00 pm','1:00 p.m.','1:00 p','1:00pm','1:00p.m.','1:00p','1 pm',
'1 p.m.','1 p','1pm','1p.m.', '1p', '13:00','13', '1a', '12', '12a', '12p', '12am', '12pm', '2400am', '2400pm', '2400',
'1000', '100', '123', '2459', '2359', '2359am', '1100', '123p',
'1234', '1', '9', '99', '999', '9999', '99999', '0000', '0011', '-1', 'mioaw' ];
for ( var i = 0; i < tests.length; i++ ) {
console.log( tests[i].padStart( 9, ' ' ) + " = " + parseTime(tests[i]) );
}
Изменения:
Все приведенные примеры не работают с 12:00 до 12:59. Они также выдают ошибку, если регулярное выражение не соответствует времени. Следующее обрабатывает это:
function parseTime (timeString) {if (timeString == '') return null; var time = timeString.match (/ (\ d +) (: (\ d \ d))? \ s * (p?) / i); если (время == ноль) вернуть ноль; var hours = parseInt (время [1], 10); если (часы == 12 &&! время [4]) {часы = 0; } еще {часы + = (часы <12 && время [4])? 12: 0; } var d = новая дата (); d.setHours (часы); d.setMinutes (parseInt (время [3], 10) || 0); d.setSeconds (0, 0); return d; } var tests = ['13:00', '13:00', '13:00', '13:00', '13:00.', '13:00', '13:00 ',' 13:00 ',' 1п ',' 13:00 ',' 13:00 ',' 1п ',' 13:00 ',' 13 ',' 1а ',' 12 ',' 12а ',' 12p, 12am, 12pm, 2400am, 2400pm, 2400, 1000, 100, 123, 2459, 2359, 2359am, 1100 , '123p', '1234', '1', '9', '99', '999', '9999', '99999', '0000', '0011', '-1', 'mioaw'] ; for (var i = 0; i
Это будет работать для строк, которые содержат время в любом месте. Таким образом, "abcde12: 00pmdef" будет проанализирован и вернет 12 часов вечера. Если желаемый результат состоит в том, что он возвращает только время, когда строка содержит только время, можно использовать следующее регулярное выражение при условии, что вы замените «time [4]» на «time [6]».
/^(\d+)(:(\d\d))?\s*((a|(p))m?)?$/i
Это более надежный подход, который учитывает, как пользователи намереваются использовать этот тип ввода. Например, если пользователь ввел «12», он будет ожидать, что это будет 12 вечера (полдень), а не 12 утра. Следующая функция обрабатывает все это. Он также доступен здесь: http://blog.de-zwart.net/2010-02/javascript-parse-time/
/ ** * Разобрать строку, которая выглядит как время, и вернуть объект даты . * @return Date объект в случае успеха, false в случае ошибки. * / String.prototype.parseTime = function () {// обрезать его и перевернуть так, чтобы минуты всегда были сначала жадными: var value = this.trim ().обеспечить регресс(); // Нам нужно перевернуть строку, чтобы сначала сопоставить минуты в жадном, затем часы var timeParts = value.match (/ (a | p)? \ S * ((\ d {2})?:?) (\ D {1,2}) / i); // Это не соответствует тому, что мы знаем if (! TimeParts) {return false; } // инвертировать: timeParts = timeParts.reverse (); // Инвертировать внутренние части: for (var i = 0; i 12? правда: полдень; // Сделать часы от 0 до 12: hours - = hours> 12? 12: 0; // Добавляем 12, если это PM, но не полдень + = после полудня && часов! = 12? 12: 0; // Удаляем 12 для полуночи: hours - =! Daily && hours == 12? 12: 0; // Проверяем корректность номера: if (минут> = 60 || часов> = 24) {return false; } // Возвращаем объект даты с этими установленными значениями. var d = новая дата (); d.setHours (часы); d.setMinutes (минуты); return d; } var tests = ['13:00', '13:00', '13:00', '13:00', '13:00.', '13:00', '13:00 ',' 13:00 ',' 1 час. ',' 13:00 ',' 13:00.',' 1p ',' 13:00 ',' 13 ',' 1a ',' 12 ',' 12a ',' 12p ',' 12am ',' 12pm ',' 2400am ',' 2400pm ',' 2400 ',' 1000 ',' 100 ',' 123 ',' 2459 ',' 2359 ',' 2359am ',' 1100 ',' 123p ',' 1234 ',' 1 ',' 9 ',' 99 ', «999», «9999», «99999», «0000», «0011», «-1», «mioaw»]; for (var i = 0; i
Это прототип строки, поэтому вы можете использовать его так:
var str = '12am';
var date = str.parseTime();
AnyTime.Converter может анализировать даты/время в различных форматах: