我今天正在为此功能编写单元测试:
/**
* 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上的runnig formatCurrentDate()
是正确的格式:'2020/08/25 14:50'
但是当我在cmd上运行相同的功能(键入节点并粘贴函数)时,我得到:'2020-08-25 14:50'
为什么会这样?
答案 0 :(得分:1)
Intl.DateTimeFormat尝试根据语言代码提供一种文化上敏感的日期组件格式。没有确定的规范或标准来将语言代码映射为格式,这取决于实现方式。另外,如果不支持特定的语言,则实现可能会退回到默认格式。因此,对于相同的语言代码和选项,不同的实现可能会给出不同的格式。
因此,依靠 Intl.DateTimeFormat 格式化日期并期望其具有精确的格式不是一个好主意。您可以使用formatToParts method来获取适当的部分,然后以所需的格式手动放置它们。
如果您想要一种特定的格式,则应该使用定制功能或格式库手动创建,您可以编写自己的格式或库,也可以使用网络上可用的多种格式之一。关于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());