节点和开发工具之间的Intl.DateTimeFormat差异



我今天正在为这个函数编写单元测试:

/**
* recives a timestamp and format to 'yyyy/mm/dd hh:mm'
*/
function formatCurrentDate(date) {
return Intl.DateTimeFormat('ja-JP',
{
hour: '2-digit',
minute: '2-digit',
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(date);
}

这个测试:

test('it should format the current date', () => {
expect(formatCurrentDate(new Date().getTime())).toMatch(new RegExp(/^d{4}/d{2}/d{2}s{1}d{2}:d{2}$/));
}); 

但总是失败,因为节点返回给我一个不同的日期格式

所以我刚刚意识到在devtools上运行formatCurrentDate(),我得到了正确的格式:"2020/08/25 14:50">

但当我在cmd上运行相同的函数(键入node并粘贴函数(时,我得到了:"2020-08-25 14:50">

为什么会发生这种事??

Intl.DateTimeFormat试图基于语言代码提供对日期组件的文化敏感的格式。没有明确的规范或标准来将语言代码映射到格式,这取决于实现。此外,如果不支持特定的语言,则实现可能会回退到默认格式。因此,不同的实现可能会为相同的语言代码和选项提供不同的格式。

因此,依赖Intl.DateTimeFormat来格式化日期并期望其具有精确的格式不是一个好主意。您可以使用formatToParts方法来获取适当的部分,然后手动将它们设置为所需的格式。

如果你想要一种特定的格式,你应该用定制的函数或格式库手动创建它,你可以自己编写,也可以使用网络上的许多格式之一。stackoverflow上已经有很多关于这个话题的问题和答案。

PS。将代码作为可运行的代码段发布是有帮助的,例如

/**
* recives a timestamp and format to 'yyyy/mm/dd hh:mm'
*/
function formatCurrentDate(date = new Date()) {
return Intl.DateTimeFormat('ja-JP',
{
hour: '2-digit',
minute: '2-digit',
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(date);
}
console.log(formatCurrentDate());

最新更新