使用 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
但是如果用于生成字符串的格式模板可以从 Intl
获得,那就很容易了。 : 类似 "dd/mm/yyyy"
.这样,字符串可以安全地分成可用于构建 Date
的部分。目的。问题是似乎无法从 Intl.DateTimeFormat
获取该信息。 .[Intl.resolvedOptions()][1]
方法不提供任何帮助,因为它只提供了在构造函数上传递的选项加上默认值。问题
有什么办法可以解析出一个
Intl
格式的字符串吗?到 Date
对象不使用 moment.js
或任何其他外部图书馆?我的用例
我正在使用接受格式和解析函数来处理日期的日期时间组件。当用户使用日期时间输入的日历控件选择日期时没有问题,格式功能使用
Intl
根据语言环境和一组格式选项对其进行格式化。有时用户编辑手动显示的日期。如果使用西类牙语区域设置,他可以看到
"27/11/2020"
显示日期,他决定将日期更改为 "28/11/2020"
.这将失败,因为 Date.parse()
无法解析此日期(见上文)。这在其他地区可能会变得更糟。我试图避免包含外部日期库,但看不到克服这个问题的方法。
我知道用户可以以任何任意格式编辑日期,但我希望至少接受控件中显示的相同格式,我认为这是对 UI 最友好的,因为总是显示默认日期。
最佳答案
当然可以使用 moment.js
对于这样的事情,但您需要根据您的代码知道您正在使用的每个地区的格式
const parseEs = moment("28/11/2020", "DD/MM/YYYY");
const parseEn = moment("11/28/2020", "MM/DD/YYYY");
到底moment
提供 toDate()
函数,以便您可以再次将其传递给区域格式(以防您使用任何组件或库添加/减去或编辑日期)const stringEs = regionEs.format(parseEs.toDate()); // "28/11/2020"
const stringEn = regionEn.format(parseEn.ToDate()); // "11/28/2020"
关于javascript - 如何解析从 Intl.DateTimeFormat 生成的日期字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64569438/