一尘不染

从Java用户输入中将时间解析为Date对象的最佳方法是什么?

javascript

我正在使用一个表单小部件,供用户在文本输入中输入一天的时间(对于日历应用程序)。我想使用JavaScript(我们使用的是jQuery
FWIW)来解析用户输入到JavaScript Date()对象中的文本的最佳方法,以便我可以轻松地执行比较和其他操作。

我尝试了该parse()方法,但对于我的需求来说有点挑剔。我希望它能够成功地将以下示例输入时间(除了其他逻辑上相似的时间格式)解析为同一Date()对象:

  • 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

我认为我可能会使用正则表达式来拆分输入并提取要用于创建Date()对象的信息。做这个的最好方式是什么?


阅读 394

收藏
2020-05-01

共1个答案

一尘不染

在您指定的输入上起作用的快速解决方案:

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]) );

}

它也应该适用于其他一些品种(例如,即使使用了am,它仍然可以使用-例如)。显然,这很粗糙,但也很轻巧(例如,使用它比完整的库便宜得多)。

警告:该代码不适用于12:00 AM等。

2020-05-01