Intl.DateTimeFormat节点和devtools之间的区别

时间:2020-08-25 17:55:06

标签: javascript node.js unit-testing date devtools

我今天正在为此功能编写单元测试:

/**
 * 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'

为什么会这样?

1 个答案:

答案 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());