浏览器不知道用户认同什么“文化”,它只能访问各种格式字符串(日期、数字、货币、语言等)的区域设置。没有标准的 JavaScript API 可以访问这些设置。
浏览器确实可以访问区域设置,但是它们不能可靠地实现任何特定的格式Date.prototype.toLocaleString,因此不可能根据浏览器对系统设置的解释可靠地将日期字符串转换为日期对象。最后,无论如何都不能保证任何任意日期字符串都符合区域设置。
解析字符串的唯一可靠方法是指定特定格式。如果您指定了 d/m/y 并且用户输入 1/6/2015,您别无选择,只能相信他们已阅读并理解所需的格式并希望将其解释为 2015 年 6 月 1 日。没有其他选择。
解析特定格式的日期并不困难,例如解析 d/m/y 格式的字符串:
function parseDMY(s) {
var b = s.split(/\D+/);
return new Date(b[2], b[1]-1, b[0]);
}
如果要验证日期,则需要额外的一行:
function parseDMY(s) {
var b = s.split(/\D+/);
var d = new Date(b[2], b[1]-1, b[0]);
return d && d.getMonth() == b[1]-1? d : new Date(NaN);
}
如果您想确保 2 位数年份被视为完整年份(大多数浏览器会将 1/1/03 转换为 1/1/1903),则还需要一行:
function parseDMY(s) {
var b = s.split(/\D+/);
var d = new Date(b[2], b[1]-1, b[0]);
d.setFullYear(b[2]);
return d && d.getMonth() == b[1]-1? d : new Date(NaN);
}