具有特定语言环境的 Javascript 日期解析

xor*_*xor 9 javascript datetime locale

我从用户输入接收日期/时间对象,并希望将它们解析为 javascript Date 对象。日期格式为:02/06/2018 00:59:03表示 2018 年 6 月的第二日;英国地区。尽管这看起来非常简单且用例场景非常广泛,但我似乎无法在文档中找到任何有关如何指定我希望用于解析的语言环境的内容。

解析器所做的只是假设我使用的是美国语言环境格式,默认情况下首先是月份,然后是日期,然后是年份,因此它混合了月份和日期。

目前我看到的唯一可用选项是编写我自己的解析器,这很好(当然不是,因为我明天可能需要另一个语言环境),但对我来说似乎有点 1980 年代。

也许我忽略了文档中的某些内容。但是有人有其他解决方案吗?将不胜感激。

Ps 我很难想象这还没有被问到,但我的搜索也没有出现太多。

chu*_*ckx 6

来自 MDN 的Date() 文档:

注意:由于浏览器的差异和不一致,强烈建议不要使用 Date 构造函数(和 Date.parse,它们是等效的)解析日期字符串。仅按惯例支持 RFC 2822 格式字符串。对 ISO 8601 格式的支持的不同之处在于,仅将日期字符串(例如“1970-01-01”)视为 UTC,而不是本地。

如果您的输入是结构化的并且格式是恒定的,那么编写您自己的解析器应该很简单。这是使用正则表达式的方法。

var dateString = '02/06/2018 00:59:03';

var dateParser = /(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/;
var match = dateString.match(dateParser);
var date = new Date(
    match[3],  // year
    match[2]-1,  // monthIndex
    match[1],  // day
    match[4],  // hours
    match[5],  // minutes
    match[6]  //seconds
);

console.log('Input: ' + dateString);
console.log('Output (en-US): ' + date.toLocaleString('en-US'));
console.log('Output (en-GB): ' + date.toLocaleString('en-GB'));
Run Code Online (Sandbox Code Playgroud)

或者,字符串拆分也很容易(即按空格拆分,然后将第一个结果拆分为/,将第二个结果拆分为:)。

  • 感谢@chuckx 的准确答案(虽然不是我希望的);加上包含的解析器。我认为现在,随着 javascript 如此先进,人们会期望像 toLocaleString() 这样的东西也有反向函数。 (3认同)