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

标签 javascript date datetime 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
但是如果用于生成字符串的格式模板可以从 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/

相关文章:

javascript - 悬停时显示div

javascript - 如何在angular js中使用orderBy移动顶部的特定元素

python - 按日期对 Pandas Dataframe 进行排序,返回唯一日期,然后返回前两个日期的纪元时间

Python 将日期时间导出到 csv

mysql - 时间查询 - 查询一列大于另一列

javascript - 第一个下拉菜单选择第二个和第三个下拉菜单

javascript - D3 树/聚类图 - 更改节点文本颜色

date - 如何在日期公式中将月份的第一个字母大写?

mysql - 使用php选择mysql中间隔之间的日期

ios - NSString 到 NSDate 格式对话问题