如何解析从 Intl.DateTimeFormat 生成的日期字符串

Dav*_*las 5 javascript datetime date internationalization

使用Intl.DateTimeFormat.format函数,您可以生成针对特定区域设置格式化的日期字符串。传递给函数的选项Intl.DateTimeFormat.format()允许了解有关格式的一些信息,例如年份是两位数还是四位数字,但有些信息是未知的,例如使用的分隔符或年、月和日元素的顺序。

尝试使用 将该字符串解析回Date对象并不总是可行的Date.parse

例如,此代码对于西班牙语区域设置失败,但对于英语区域设置有效:

const date = new Date(2020, 10, 28);

const regionEs = new Intl.DateTimeFormat('es', { timeZone: 'UTC' });
const regionEn = new Intl.DateTimeFormat('en', { timeZone: 'UTC' });

const stringEs = regionEs.format(date); // "28/11/2020"
const stringEn = regionEn.format(date); // "11/28/2020"

const parseEs = new Date(Date.parse(stringEs)); // Error -> Trying to set month to 28
const parseEn = new Date(Date.parse(stringEn)); // Ok
Run Code Online (Sandbox Code Playgroud)

但如果用于生成字符串的格式模板可以从以下位置获得,那就很容易了Intl:类似"dd/mm/yyyy". 这样,字符串就可以安全地分割成可用于构建Date对象的部分。问题是似乎不可能从 获取该信息Intl.DateTimeFormat

[Intl.resolvedOptions()][1]方法不提供任何帮助,因为它只提供返回构造函数上传递的选项以及默认值。

问题

有没有办法在不使用或任何其他外部库的情况下将格式化的字符串解析回Intl对象?Datemoment.js

我的用例

我正在使用一个日期时间组件,它接受格式和解析函数来处理日期。当用户使用日期时间输入的日历控件选择日期时,没有问题,并且格式函数用于Intl根据区域设置和一组格式选项对其进行格式化。有时,用户手动编辑显示的日期。如果使用西班牙语言环境,他可以看到"27/11/2020"显示的日期,并决定将日期更改为"28/11/2020"。这将失败,因为Date.parse()无法解析该日期(见上文)。在其他地区,这种情况可能会变得更糟。我试图避免包含外部日期库,但没有找到克服这个问题的方法。我知道用户可以以任意格式编辑日期,但我想至少接受控件中显示的相同格式,我认为这是最 UI 友好的,因为总是显示默认日期。

Han*_*azi -2

当然你可以使用moment.js这样的东西,但是你需要根据你的代码知道你正在使用的每个区域的格式

const parseEs = moment("28/11/2020", "DD/MM/YYYY");
const parseEn = moment("11/28/2020", "MM/DD/YYYY");
Run Code Online (Sandbox Code Playgroud)

最后moment提供toDate()功能,以便您可以再次将其传递为区域格式(如果您使用任何组件或库添加/减去或编辑日期)

const stringEs = regionEs.format(parseEs.toDate()); // "28/11/2020"
const stringEn = regionEn.format(parseEn.ToDate()); // "11/28/2020"
Run Code Online (Sandbox Code Playgroud)