Что лучший способ состоит в том, чтобы проанализировать время в объект Даты от ввода данных пользователем в JavaScript?

Встроенные функции имеют специальные правила о том, что означает extern. (Обратите внимание, что встроенные функции являются расширением C99 или GNU, они не были в оригинале C.

Для не-встроенных функций extern не требуется, поскольку он включен по умолчанию.

Обратите внимание, что правила для C ++ различны. Например, extern "C" требуется в объявлении C ++ для функций C, которые вы собираетесь вызывать из C ++, и существуют разные правила inline.

63
задан Andy Lester 2 October 2008 в 16:10
поделиться

9 ответов

Быстрое решение, которое работает над входом, который Вы определили:

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, и т.д.

70
ответ дан Dave Jarvis 7 November 2019 в 12:26
поделиться

Почему бы не использовать проверку для сужения то, что пользователь может вставить и упростить список, чтобы только включать форматы, которые могут быть проанализированы (или проанализированы после некоторой тонкой настройки).

я не думаю, что это просит, чтобы слишком много потребовало, чтобы пользователь поместил время в поддерживаемый формат.

dd:dd (m)/P (m)

dd (m)/P (m)

dd

0
ответ дан Wayne 7 November 2019 в 12:26
поделиться
/(\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 );

спасибо

0
ответ дан BNL 7 November 2019 в 12:26
поделиться

Я столкнулся с несколькими петлями в реализации решения 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]) );
}
3
ответ дан Dave Jarvis 7 November 2019 в 12:26
поделиться

Не потрудитесь делать его сами, просто используйте datejs.

34
ответ дан Jim 7 November 2019 в 12:26
поделиться

Вот улучшение на версия 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]) );
}

Изменения:

  • Добавленный параметр основания к parseInt () вызовы (таким образом, jslint не будет жаловаться).
  • Сделанный regex случаем-insenstive так "14:23" работает как "14:23"
11
ответ дан 3 revs, 2 users 60% 7 November 2019 в 12:26
поделиться

Все приведенные примеры не работают с 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 

/^(\d+)(:(\d\d))?\s*((a|(p))m?)?$/i
50
ответ дан 24 November 2019 в 15:39
поделиться

Это более надежный подход, который учитывает, как пользователи намереваются использовать этот тип ввода. Например, если пользователь ввел «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 
                     
                     
2
ответ дан 24 November 2019 в 15:39
поделиться

AnyTime.Converter может анализировать даты/время в различных форматах:

http://www.ama3.com/anytime/

2
ответ дан 24 November 2019 в 15:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: