toLocaleDateString 的相反方法

Posted

技术标签:

【中文标题】toLocaleDateString 的相反方法【英文标题】:Opposite method to toLocaleDateString 【发布时间】:2015-06-19 11:00:07 【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

不保证 toLocaleString 会尊重任何“文化”。据我了解,对于英国公民来说,6 月 1 日通常会缩写为 1/6。美国人会有所期待。要可靠地解析字符串,您必须告诉解析器格式是什么,否则它必须猜测,并且它没有比您更好的知识 1/6/2015 代表 6 月 1 日还是 1 月 6 日(由于美国习惯将首先是月份编号以及该格式在软件中的普遍使用)。 谢谢 RobG,我刚刚更新了问题。 【参考方案1】:

浏览器不知道用户识别的“文化”是什么,它只能访问各种格式化字符串(日期、数字、货币、语言等)的区域设置。没有标准的 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);

【讨论】:

以上是关于toLocaleDateString 的相反方法的主要内容,如果未能解决你的问题,请参考以下文章

toLocaleDateString() 未返回 dd/mm/yyyy 格式

IE11下javascript报堆栈溢出问题的解决

js日期转换

Date日期方法

tolocaletimestring 啥意思

添加时间周期一年半年季度