首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从JavaScript中的用户输入将时间解析为Date对象?

如何从JavaScript中的用户输入将时间解析为Date对象?
EN

Stack Overflow用户
提问于 2008-09-27 03:13:02
回答 21查看 69.8K关注 0票数 74

我正在开发一个表单小部件,让用户在文本输入中输入一天中的时间(用于日历应用程序)。使用JavaScript (我们使用的是jQuery FWIW),我希望找到解析用户输入到JavaScript中的文本的最佳方法Date()对象,这样我就可以很容易地对它执行比较和其他操作。

我试过了parse()方法,而且它对我的需要有点太挑剔了。我希望它能够成功地将以下示例输入时间(除了其他逻辑上相似的时间格式)解析为相同的Date()对象:

  • 下午1:00
  • 下午1:00
  • 下午1:00
  • 下午1:00
  • 下午1:00
  • 1:00p
  • 下午1时
  • 下午1点
  • 1页
  • 下午1点
  • 下午1点
  • 1p
  • 13:00
  • 13

我在想,我可能会使用正则表达式来分割输入,并提取我想要用来创建我的Date()对象。要做到这一点,最好的方法是什么?

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2008-09-26 19:44:31

一个对您指定的输入有效的快速解决方案:

代码语言:javascript
复制
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]) );
}

它应该也适用于其他一些品种(即使在a.m.使用它,它仍然可以工作-例如)。显然,这是相当粗糙的,但它也是相当轻量级的(例如,使用它比使用一个完整的库要便宜得多)。

警告:代码在12:00 AM等情况下不起作用。

票数 76
EN

Stack Overflow用户

发布于 2010-02-03 07:50:20

从12:00到12:59,提供的所有示例都无法工作。如果正则表达式与时间不匹配,它们也会抛出错误。下面的代码将处理此问题:

代码语言:javascript
复制
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;
}


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

这将适用于在任意位置包含时间的字符串。所以"abcde12:00pmdef“将被解析并返回12 pm。如果期望的结果是它只返回一个时间,而字符串中只包含一个时间,则可以使用以下正则表达式,前提是您将"time“替换为”time4“with "time6“。

代码语言:js
复制
/^(\d+)(:(\d\d))?\s*((a|(p))m?)?$/i
票数 55
EN

Stack Overflow用户

发布于 2008-09-26 19:18:53

不要费心自己做,只需使用日期

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/141348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档