如何防止 JavaScript Date Constructor 接受无效日期?
How to prevent JavaScript Date Constructor from accepting invalid dates?
我意识到这可能是一项功能,但我需要日期构造函数在无效日期上保释,而不是自动将其滚动到适当的日期。实现此目标的最佳方法是什么?
new Date('02/31/2015');
变成
Tue Mar 03 2015 00:00:00 GMT-0500 (EST)
抱歉,如果有人问过这个问题,我没能找到它 to/am 太笨了 :)。
看来你不能在非法日期强制失败。 MDN docs 声明,观察到的行为应该仅在使用超过 1 个参数调用构造函数时发生,但此条件似乎不成立(至少在 chrome 40 上不成立)。
但是,您可以重新转换日期并与原始字符串进行比较:
var s = '02/31/2015';
var d = new Date(s)
var s_re = d.toLocaleDateString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' } );
if (s === s_re) {
// ok
}
您不能将 JavaScript 日期对象设置为无效日期。
尽管如此,您可能想要 check if a date is invalid。
如果您可以指望字符串输入被格式化为数字(没有工作日或月份名称),您可以在创建日期对象之前查看输入。
function validDate(s){
//check for day-month order:
var ddmm= new Date('12/6/2009').getMonth()=== 5;
//arrange month,day, and year digits:
var A= s.split(/\D+/).slice(0, 3),
month= ddmm? A[1]: A[0],
day= ddmm? A[0]: A[1],
y= A.pop(),
//figure february for given year:
feb= y%4== 0 && (y%100 || y%400== 0)? 29: 28,
// set maximum days per month:
mdays= [0, 31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
//if the string is a valid calendar date, return a date object.
//else return NaN (or throw an Error):
return mdays[parseInt(month, 10)]-A[1]>= 0? new Date(s): NaN;
}
validDate('02/29/2015')
/*返回值:(个数)
钠盐
*/
我最终使用了 moment.js。它在其他 Date 对象增强功能中具有验证和溢出计算。感谢凯文威廉姆斯
我意识到这可能是一项功能,但我需要日期构造函数在无效日期上保释,而不是自动将其滚动到适当的日期。实现此目标的最佳方法是什么?
new Date('02/31/2015');
变成
Tue Mar 03 2015 00:00:00 GMT-0500 (EST)
抱歉,如果有人问过这个问题,我没能找到它 to/am 太笨了 :)。
看来你不能在非法日期强制失败。 MDN docs 声明,观察到的行为应该仅在使用超过 1 个参数调用构造函数时发生,但此条件似乎不成立(至少在 chrome 40 上不成立)。
但是,您可以重新转换日期并与原始字符串进行比较:
var s = '02/31/2015';
var d = new Date(s)
var s_re = d.toLocaleDateString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' } );
if (s === s_re) {
// ok
}
您不能将 JavaScript 日期对象设置为无效日期。
尽管如此,您可能想要 check if a date is invalid。
如果您可以指望字符串输入被格式化为数字(没有工作日或月份名称),您可以在创建日期对象之前查看输入。
function validDate(s){
//check for day-month order:
var ddmm= new Date('12/6/2009').getMonth()=== 5;
//arrange month,day, and year digits:
var A= s.split(/\D+/).slice(0, 3),
month= ddmm? A[1]: A[0],
day= ddmm? A[0]: A[1],
y= A.pop(),
//figure february for given year:
feb= y%4== 0 && (y%100 || y%400== 0)? 29: 28,
// set maximum days per month:
mdays= [0, 31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
//if the string is a valid calendar date, return a date object.
//else return NaN (or throw an Error):
return mdays[parseInt(month, 10)]-A[1]>= 0? new Date(s): NaN;
}
validDate('02/29/2015')
/*返回值:(个数) 钠盐 */
我最终使用了 moment.js。它在其他 Date 对象增强功能中具有验证和溢出计算。感谢凯文威廉姆斯