如何解决如何解析从Intl.DateTimeFormat
使用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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。