在Javascript中用户输入中解析Date对象的最佳方法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

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

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

  • 1:00 PM
  • 1:00 PM
  • 1:00 p
  • 1:00 PM
  • 1:00 PM。
  • 1:00P
  • 下午1点
  • 下午1点
  • 1页
  • 下午1点
  • 下午1点
  • 1P
  • 13:00
  • 13

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

提问于
用户回答回答于

一个快速解决方案,可以处理您指定的输入内容:

var times = ['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'];
    
    for ( var i = 0; i < times.length; i++ ) {
      var d = new Date();
      var time = times[i].match(/(\d+)(?::(\d\d))?\s*(p?)/);
      d.setHours( parseInt(time[1]) + (time[3] ? 12 : 0) );
      d.setMinutes( parseInt(time[2]) || 0 );
      console.log( d );
    }

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

用户回答回答于

所提供的所有示例都不能在上午12:00至上午12:59之间运行。如果正则表达式与时间不匹配,它们也会抛出一个错误。以下处理:

function parseTime(timeString) {    
    if (timeString == '') return null;

    var time = timeString.match(/(\d+)(:(\d\d))?\s*(p?)/i); 
    if (time == null) return null;

    var hours = parseInt(time[1],10);    
    if (hours == 12 && !time[4]) {
          hours = 0;
    }
    else {
        hours += (hours < 12 && time[4])? 12 : 0;
    }   
    var d = new Date();             
    d.setHours(hours);
    d.setMinutes(parseInt(time[3],10) || 0);
    d.setSeconds(0, 0);  
    return d;
}

这将适用于其中包含时间任何地方的字符串。所以“abcde12:00pmdef”将被解析并返回12点。如果期望的结果是只返回字符串只包含时间的时间,则可以使用以下正则表达式,只要将“time [4]”替换为“time [6]”。

/^(\d+)(:(\d\d))?\s*((a|(p))m?)?$/i

扫码关注云+社区