Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript toLocaleDateString的相反方法_Javascript_Jquery_Globalization_Culture - Fatal编程技术网

Javascript toLocaleDateString的相反方法

Javascript toLocaleDateString的相反方法,javascript,jquery,globalization,culture,Javascript,Jquery,Globalization,Culture,为了创建尊重浏览器区域性的字符串,我们可以执行以下操作: 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 =

为了创建尊重浏览器区域性的字符串,我们可以执行以下操作:

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

有什么建议吗?

浏览器不知道用户所认同的“文化”,它只能访问不同格式字符串(日期、数字、货币、语言等)的区域设置。没有标准的javascript API来访问这些设置

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

解析字符串的唯一可靠方法是指定特定格式。如果您指定了d/m/y,且用户输入了2015年6月1日,则您别无选择,只能相信他们已阅读并理解所需格式,并打算将其解释为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);
}
如果要确保将两位数的年份视为完整年份(大多数浏览器会将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);
}

不能保证toLocaleString会尊重任何“文化”。据我所知,对于英国公民来说,6月1日通常缩写为1/6。美国人会有不同的期望。要可靠地解析字符串,您必须告诉解析器格式是什么,否则它必须猜测,而且它并不比您更清楚2015年6月1日代表6月1日还是1月6日(这要归功于美国习惯将月号放在首位,以及该格式在软件中的广泛使用)。感谢RobG,我刚刚更新了这个问题。