使用特定区域设置的Javascript日期解析

16

我从用户输入接收日期/时间对象,并想将它们解析为JavaScript Date对象。日期格式为:02/06/2018 00:59:03,表示2018年6月2日; 英国地区。 尽管这似乎非常琐碎且是一个超级普遍的使用情况,但我在文档中找不到如何指定我想要用于解析的区域设置。

解析器假设我使用的是美国地区格式,该格式默认为先月份,然后是日期,然后是年份,因此它混淆了月份和日期。

目前我看到的唯一可用选项是编写自己的解析器,这还可以(当然,如果明天我需要另一个区域设置时就不行了),但对我来说有些过时了。

也许我在文档中忽略了什么。但是有人有其他解决方案吗?将不胜感激。

附:我几乎无法想象这个问题还没有被问过,但我的搜索结果并不多。


2
https://momentjs.com/timezone/ - Andreas
1个回答

11

来自 MDN 的 Date() 文档:

注意:强烈不建议使用 Date 构造函数(以及 Date.parse,它们是等价的)解析日期字符串,因为浏览器之间存在差异和不一致性。对 RFC 2822 格式字符串的支持仅基于约定。对 ISO 8601 格式的支持有所不同,只包括日期字符串(例如“1970-01-01”),而不是本地时间。

如果你的输入结构化且格式固定,编写自己的解析器应该很简单。下面是一种使用正则表达式的方法。

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'));

另外,字符串拆分也非常容易(即按空格拆分,然后将第一个结果按/拆分,将第二个结果按:拆分)。


6
感谢 @chuckx 提供准确的答案(虽然不是我希望得到的),还有提供的解析器。我认为现在随着 JavaScript 技术的进步,像 toLocaleString() 这样的函数应该有反向函数才对。 - Frido Emans
我的回答适用于您坚持使用原生JS的情况。然而,正如@Andreas所提到的,momentjs是一个解决您问题的库。具体来说,请参见解析功能,您可以在其中指定输入格式 - chuckx
是的,我忘了提到我正在寻找一个原生解决方案,否则我会立即使用库。 - Frido Emans
xor: 这可能会有所帮助 https://dev59.com/H1UL5IYBdhLWcg3wv6Vx#53211160。它返回本地日期格式化字符串。 - lenooh
在 TypeScript 中,您需要使用此语法以避免错误:parseInt(match![3]), // year 等。 - Matthieu Charbonnier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接