我正在构建一个JavaScript和HTML小部件,它将驻留在外部网页上(通过复制/粘贴的代码段)并反馈到rails应用程序中。我注意到JavaScript函数Date.parse("09/31/2014")
返回一个数字,好像它是一个真实日期(今年9月只有30天),但是当这样的日期到达后端时,rails拒绝它(可以通过运行{来证明) IRB中的{1}}。
我正在寻找一种不依赖外部库的解决方案,因为作为嵌入式小部件,我不想将大量外部资源加载到主机页面。
答案 0 :(得分:0)
当您使用示例中的输入运行Date.parse时,javascript会注意到您在9月份有太多天并且溢出到10月份。返回的数字是2014年10月1日的时间戳。如果您将数字传递给Date构造函数以创建新的Date对象,则可以告诉它。
var date = new Date(Date.parse("09/31/2014"));
console.log(date.toLocaleDateString()); // "10/1/2014"
如果该溢出是可接受的,那么重新解析这样的时间戳将允许您编写一个函数来将字符串中的日期更正为有效的日期。如果该溢出是不可接受的,并且您只需要验证用户输入并使其更正,那么您可以轻松地根据重新解析的日期对象的值检查用户字符串的每个组件。
function validateDateString(inputString) {
var day, month, year,
valid = false,
dateRegex = /([\d]{1,2})\/([\d]{1,2})\/((?:[\d]{2}){1,2})/,
searched = dateRegex.exec(inputString),
dateObj = new Date(Date.parse(inputString));
if (searched) {
// If we're here, the date regex found a match
// Assume date is valid until checks prove otherwise
valid = true;
month = parseInt(searched[1], 10);
day = parseInt(searched[2], 10);
year = parseInt(searched[3], 10);
// Date object months are zero indexed
if (month !== (dateObj.getMonth() + 1)) {
valid = false;
} else if (day !== dateObj.getDate()) {
valid = false;
} else if (year !== dateObj.getFullYear()) {
valid = false;
}
}
return valid;
}
对于您提供的无效日期输入,上述函数将返回false(我假设日期字符串的格式始终保持一致),但对于相同格式的有效日期字符串将返回true。