toLocaleDateString 的相反方法

Opposite method to toLocaleDateString

为了创建尊重浏览器文化的字符串,我们可以这样做:

var myDate = new Date();
var myDateString = myDate.toLocaleDateString(myDate); //returns a string

这很好,因为如果我在葡萄牙,6 月 1 日,这将输出“01/06/2015”,而如果我在美国,它将输出“06/01 /2015".

现在我想要完全相反的东西。我要:

var myDateString = "01/06/2015"
var myDate = myDateString.toLocaleDate(); //it should return a Date

有什么建议吗?

浏览器不知道 "culture" 用户的身份,它只能访问各种格式化字符串(日期、数字、货币、语言等)的区域设置。没有标准 javascript API 来访问这些设置。

浏览器确实可以访问区域设置,但是它们无法可靠地实现 Date.prototype.toLocaleString 的任何特定格式,因此无法可靠地将日期字符串转换为基于浏览器对系统设置的解释的 Date 对象。最后,不能保证任何任意日期字符串无论如何都会符合区域设置。

解析字符串的唯一可靠方法是指定特定格式。如果您已指定 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);
}