如何解决Intl.DateTimeFormat节点和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'
为什么会这样?
解决方法
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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。