【问题标题】:Intl.DateTimeFormat difference beetween node and devtools节点和开发工具之间的 Intl.DateTimeFormat 差异
【发布时间】:2020-12-14 11:35:25
【问题描述】:

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

/**
 * 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 上运行相同的功能(键入节点并粘贴功能)时,我得到:'2020-08-25 14:50'

为什么会这样??

【问题讨论】:

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


    【解决方案1】:

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

    因此,依靠 Intl.DateTimeFormat 来格式化日期并期望它具有精确的格式并不是一个好主意。您可以使用formatToParts method 获取适当的部分,然后手动将它们放入您想要的格式。

    如果您需要特定格式,您应该使用您自己编写的定制函数或格式库手动创建它,或者使用网络上提供的众多格式库之一。 stackoverflow 上已经有很多关于该主题的问题和答案。

    附言。将代码发布为可运行的 sn-p 会很有帮助,例如

    /**
     * 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());

    【讨论】:

      猜你喜欢
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多