Safari JS无法解析YYYY-MM-DD日期格式?

Aus*_*yde 37 javascript safari validation datetime

在我正在进行的项目中,我需要验证输入的日期 <input type="date">

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

我正在使用以下技术在提交表单之前验证字段:

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

format_mysql()原型函数在哪里将日期(正确)格式化为MySQL日期时间格式(YYYY-MM-DD).

-'s 替换为' /(YYYY/MM/DD)会产生"正确"的时间戳.

我应该注意,该字段应该接受任何日期格式,而不仅仅是YYYY-MM-DD,虽然我想,但我不能使用像Date.js这样的库

我该如何解决这个问题,还是有更好的方法来解析/验证日期?

CMS*_*CMS 57

Date.parse方法的行为依赖于实现,在ECMAScript 5上,此方法可以解析ISO8601格式的日期,但我建议您手动进行解析.

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

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');
Run Code Online (Sandbox Code Playgroud)

您还可以检测ECMAScript 5行为以解析ISO格式的日期,您可以检查它Date.prototype.toISOString是否可用,例如:

if (typeof Date.prototype.toISOString == "function") {
  // ES5 ISO date parsing available
}
Run Code Online (Sandbox Code Playgroud)

  • +1,你打败了我.作为OP的建议,我会考虑从日期的单个输入元素移开,以避免用户在自己的语言环境中输入日期的情况(例如混合dd和mm).要么是这样,要么使用只读输入和日期选择器控件. (3认同)

小智 13

通常DD-MM-YYYY格式不支持safari.

value = 2010/06/21; //应该管用.

(要么)

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