Safari JS不能parsingYYYY-MM-DD的date格式?

在我正在处理的项目中,我需要validationinput到<input type="date">

使用Safari 4/5(在Mac OSX上),JavaScript无法parsing格式YYYY-MM-DD ,返回NaN而不是预期的纪元时间戳。

我正在使用以下技术来validation提交表单之前的字段:

 //value = '2010-06-21' var stamp = Date.parse(value); if (isNaN(stamp)) { //notify user } else { value = new Date(stamp).format_mysql(); } 

其中format_mysql()是一个将date(正确)格式化为MySQLdate时间格式(YYYY-MM-DD)的原型函数。

/ 's(YYYY / MM / DD)代替-产生一个“正确的”时间戳。

我应该注意,该字段应该接受任何date格式,不只是YYYY-MM-DD,尽pipe我想,我不能使用像Date.js这样的库

我该如何解决这个问题,还是有更好的方法来parsing/validationdate?

Date.parse方法的行为是依赖于实现的,在ECMAScript 5上,这个方法可以parsingISO8601格式化的date,但是我build议你手动进行parsing。

前一段时间我做了一个简单的函数,可以处理一个格式说明符参数:

 function parseDate(input, format) { format = format || 'yyyy-mm-dd'; // default format var parts = input.match(/(\d+)/g), i = 0, fmt = {}; // extract date-part indexes from the format format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; }); return new Date(parts[fmt['yyyy']], parts[fmt['mm']]-1, parts[fmt['dd']]); } parseDate('06.21.2010', 'mm.dd.yyyy'); parseDate('21.06.2010', 'dd.mm.yyyy'); parseDate('2010/06/21', 'yyyy/mm/dd'); parseDate('2010-06-21'); 

你也可以检测ECMAScript 5的行为来parsingISO格式的date,你可以检查Date.prototype.toISOString是否可用,例如:

 if (typeof Date.prototype.toISOString == "function") { // ES5 ISO date parsing available } 

一般DD-MM-YYYY格式在safari中不支持。

价值= 2010/06/21; //应该pipe用。

(要么)

value = new Date('2010-06-21'.replace(/ – / g,“/”));

该字段应该接受任何date格式

你不是指你的意思。

  • M / D / Y(美国)和D / M / Y(英国)之间难以可靠区分。 DMY在英国是比较常见的,但决不是普遍的。
  • 祝大家1600年前的日子好运 – 格里历(太阳)日历于1582年推出,并且在20世纪才被采纳(大多数是普遍的)(维基百科给出了1929年)。 2月30日是瑞典的有效date。
  • OS X给你13(!)日历的select,但默认是公历。

相反,我build议使用日历小部件。 我认为JQuery有一个,但ICBW。

你可以从input中得到明确的date,但你仍然需要检查,所以用户不会在4月31日给你。

 <fieldset id= "localdate"> <select id= "monthselect" size= "1"> <option selected= "selected"> January</option> <option> February</option> <option> March</option> <option> April</option> <option> May</option> <option> June</option> <option> July</option> <option> August</option> <option> September</option> <option> October</option> <option> November</option> <option> December</option> </select> <label> Date: <input name= "inputdate" size= "2" value= "1"> </label> <label> Year: <input name= "inputyear" size= "4" value= "2010"> </label> </fieldset> 

document.getElementsByName的快捷方式

函数byName(s,n){n = n || 0; return document.getElementsByName(s)[n]; }

 function getDateInput(){ var day, y= parseInt(byName('inputyear').value), m= byName('monthselect').selectedIndex, d= parseInt(byName('inputdate').value); if(!y || y<1000 || y> 3000) throw 'Bad Year '+y; if((!d || d<1 || d> 32) throw 'Bad Date '+d; day= new Date(y,m,d); if(day.getDate()!= d) throw 'Bad Date '+d; value= day.format_mysql(); } 

您可以预设字段以反映当前的date载入

 onload= function(){ var now= new Date(); byName('inputyear').value= now.getFullYear(); byName('monthselect').selectedIndex= now.getMonth(); byName('inputdate').value= now.getDate(); }